2011-05-21 91 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

相关问题