2011-05-21 92 views

回答

7

我會爲此使用JDialogs,因爲我認爲這可以讓您更多地控制代碼如何運行和顯示。但是也可以使用JOptionPanes來完成。例如,如果您在JOptionPane中顯示了一個JButton,其ActionListener導致顯示另一個JOptionPane。

對於例如

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class NestedJOptions { 
    public static void main(String[] args) { 
     final JPanel panel = new JPanel(); 
     panel.add(new JButton(new AbstractAction("Push Me") { 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(panel, "hello world!"); 
     } 
     })); 

     JOptionPane.showMessageDialog(null, panel); 
    } 
} 
+0

你剛剛建議...是的,你做了;-)有趣的方式來完成一些可能是OP所尋找的東西。 – Howard 2011-05-21 19:38:56

+0

真的很瘋狂,奇怪... +1 – mKorbel 2011-05-21 20:35:26

+0

這是很酷的,btw它爲什麼會起作用?不是所有的對話都是模態的? – Pacerier 2011-05-23 01:50:38

2

編輯:鰻魚@Hovercraft完整提供更好的解決方案;更可能是OP要找的東西。

從JOptionPane的javadocs

所有對話框都是有模式。每個 showXxxDialog方法都會阻止調用者 ,直到完成用戶的交互爲 。

所以,不,您將無法通過JOptionPane實現所需的功能。但JOptionPane是一個便利的類,創造了幾個經常遇到的JDialog s。由於您需要的功能不直接受JOptionPane的支持,因此您應該考慮直接使用JDialog s來實現它。例如:

public class DialogTest { 
    static final SimpleDateFormat SDF = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss"); 

    public static void main(String[] args) { 

     final JFrame frame = new JFrame("Dialog test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(createPanelToPopDialog(frame)); 
     frame.setSize(500, 200); 
     frame.show(); 
    } 

    static JPanel createPanelToPopDialog(final JFrame parent) { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     JButton button = new JButton("Pop a Dialog"); 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JDialog dialog = new JDialog(parent, true); 
       dialog.add(createPanelToPopDialog(parent)); 
       dialog.setSize(500, 200); 
       dialog.show(); 
      } 
     }); 
     panel.add(button, BorderLayout.SOUTH); 
     panel.add(new JLabel("Created at " + SDF.format(new Date()))); 

     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     return panel; 
    } 
} 
+0

我不同意。請參閱我的示例代碼。它不能從調用者塊的代碼完成,但它可以通過JOptionPane持有的Swing代碼完成。 – 2011-05-21 19:36:39

+0

@ Hovercraft - 同意。我忘記了'JOptionPane'選項,它允許你傳入你自己的'Component'來渲染。 – 2011-05-21 19:56:05

-1

你有沒有試過它,遇到了一些問題,或者你只是問? JOptionPane的是模態,因此它阻止它在創建線程您可以生成多個線程,顯示幾個JOptionPanes:

for (int i = 0; i < 5; i++) { 
      Thread t = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        JOptionPane.showMessageDialog(null, "I'm thread " + Thread.currentThread().getId()); 
       } 
      }); 
      t.start(); 
     } 

,但只有一個消息對話框將能夠接收擺動事件。你必須按照它們出現的順序關閉它們(這是隨機的)。

+1

多線程將是一個壞主意,因爲所有的Swing代碼都需要從相同的線程EDT調用,但是這並不是必需的。 – 2011-05-21 19:39:29

+0

向下投票,因爲現在您給出了打破Swing單線程規則的示例代碼,並不好。我建議你刪除這個答案。 – 2011-05-21 19:42:22

+0

@Hovercraft Full Of Eels:我相信Swing在創建新窗口時需要一些額外的安全措施,所以啓動幾個創建對話框的線程就沒問題,因爲只有一個模式窗口會接收到swing事件。必須格外小心,但可以完成。 – 2011-05-21 19:43:00

相關問題