Java 是否可以有多个JOptionPane对话框?

Java 是否可以有多个JOptionPane对话框?,java,multithreading,swing,joptionpane,jcomponent,Java,Multithreading,Swing,Joptionpane,Jcomponent,有人知道如何在另一个JOptionPane对话框的上方有一个JOptionPane对话框吗?我会使用JDialogs来实现这一点,因为我认为这可以让您更好地控制代码的运行和显示方式。但也可以用三角窗来完成。例如,如果在JOptionPane中显示一个JButton,其ActionListener导致另一个JOptionPane的显示 例如 import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import ja

有人知道如何在另一个JOptionPane对话框的上方有一个JOptionPane对话框吗?

我会使用JDialogs来实现这一点,因为我认为这可以让您更好地控制代码的运行和显示方式。但也可以用三角窗来完成。例如,如果在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);
   }
}

编辑:@满是鳗鱼的气垫船提供了更好的解决方案;更有可能是OP在寻找什么

从JOptionPane:

所有对话框都是模态的。每个 showXxxDialog方法阻止调用方 直到用户的交互被激活 完成

因此,不,您将无法使用
JOptionPane
实现所需的功能。但是
JOptionPane
是一个方便的类,可以创建一些常见的
JDialog
s。因为您想要的功能不直接被<代码> JoptPANGE< /Cult> s支持,您应该考虑使用<代码> jCalue例如:

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

你有没有试过,但遇到了一些问题,或者你只是在问?JOptionPane是模态的,因此它会阻止创建它的线程。您可以生成多个显示多个JoptionPane的线程:

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();
        }
for(int i=0;i<5;i++){
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
showMessageDialog(null,“我是线程”+thread.currentThread().getId());
}
});
t、 start();
}

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

我不同意。请参阅我的示例代码。它不能从调用程序块的代码中完成,但可以从JOptionPane持有的Swing代码中完成。@Hovercraft-同意。我忘记了
JOptionPane
选项,该选项允许您传入自己的
组件
进行渲染。您刚才是否建议。。。是的,你做到了;-)完成某件事情的有趣方式,这可能是OP想要的。这很酷,顺便问一句,为什么它有效?shldn不是所有对话框都是模态的吗?@Pacerier:这些对话框都是JOptionPanes,所以是的,它们当然都是模态的。多线程将是一个坏主意,因为所有Swing代码都需要从同一个线程EDT调用,但更重要的是,它不是必需的。因为现在您给出的示例代码打破了Swing单线程规则,所以不太好。我建议您删除这个答案。@Hovercraft Full Of Eels:我相信Swing在创建新窗口时会采取一些额外的安全措施,因此启动几个创建对话框的线程是可以的,因为只有一个模式窗口将接收Swing事件。我们必须格外小心,但这是可以做到的。不,它应该是一个线程,而且只能是一个线程,因为即使是JOptionPanes也应该在EDT上创建。请看我的帖子,看看如何在EDT上完成这一切。@装满鳗鱼的气垫船:太多的遵循规则也是不好的。我在查看创建新对话框的AWT代码,我确信有同步,并检查我们是否在EDT上。所以我假设回答这个问题的代码是合法的,并且没有违反swing的规则。一个人必须小心,但不能过于迂腐。