簡體   English   中英

是否有可能有多個JOptionPane對話框?

[英]is it possible to have multiple JOptionPane dialogs?

有誰知道我們如何在另一個JOptionPane對話框上面有一個JOptionPane對話框?

我會使用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);
   }
}

編輯:@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;
    }
}

你試過它並遇到了一些問題,或者你只是在問? 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();
        }

但只有一個消息對話框才能接收回轉事件。 你必須按它們出現的順序關閉它們(這是隨機的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM