是否有可能有多个JOptionPane对话框?

时间:2011-05-21 19:27:45

标签: java multithreading swing joptionpane jcomponent

有谁知道我们如何在另一个JOptionPane对话框上面有一个JOptionPane对话框?

3 个答案:

答案 0 :(得分: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);
   }
}

答案 1 :(得分:2)

编辑:@Hovercraft全鳗鱼提供更好的解决方案;更有可能是OP正在寻找的东西。

来自JOptionPane javadocs

  

所有对话都是模态的。每   showXxxDialog方法阻止调用者   直到用户的互动为止   完整。

所以,不,你将无法使用JOptionPane实现所需的功能。但JOptionPane是一个便利类,可以创建很少见的JDialog。由于JOptionPane不直接支持您想要的功能,因此您应该考虑使用JDialog直接实现它。例如:

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;
    }
}

答案 2 :(得分:-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();
        }

但只有一个消息对话框能够接收回转事件。你必须按它们出现的顺序关闭它们(这是随机的)。