Можно ли иметь несколько диалогов JOptionPane? - PullRequest
2 голосов
/ 21 мая 2011

Кто-нибудь знает, как у нас есть диалог JOptionPane над другим диалогом JOptionPane?

Ответы [ 3 ]

7 голосов
/ 21 мая 2011

Я бы использовал для этого JDialogs, так как я думаю, что это дает вам немного больше контроля над тем, как код запускается и отображается.Но это можно сделать и с JOptionPanes.Например, если вы отобразили JButton в панели JOptionPane, 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);
   }
}
2 голосов
/ 21 мая 2011

РЕДАКТИРОВАТЬ: @Hovercraft Full of Eels обеспечивают лучшее решение;более вероятно, что ищет ОП.

Из JOptionPane javadocs :

Все диалоги являются модальными.Каждый метод showXxxDialog блокирует вызывающего до тех пор, пока взаимодействие с пользователем не будет завершено.

Так что нет, вы не сможете достичь желаемой функциональности с помощью JOptionPane.Но JOptionPane - это удобный класс для создания немногих часто встречающихся JDialog с.Поскольку требуемая функциональность напрямую не поддерживается JOptionPane s, вам следует рассмотреть возможность ее реализации напрямую, используя 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 голосов
/ 21 мая 2011

вы пробовали это и столкнулись с какой-то проблемой, или вы просто спрашиваете? 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();
        }

Но только одно диалоговое окно сообщений сможет получать события свинга. Вы должны закрыть их в порядке их появления (что является случайным).

...