2011-05-21 3 views

ответ

7

Я бы использовал 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); 
    } 
} 
+0

Вы просто предложили ... да, вы сделали ;-) Интересный способ добиться чего-то, что может быть то, что искали OP. – Howard

+0

действительно сумасшедший, странный ... +1 – mKorbel

+0

это здорово, кстати, почему это работает? Все диалоги не являются модальными? – Pacerier

2

РЕДАКТИРОВАТЬ: @Hovercraft Полный Угри обеспечить лучшее решение; более вероятно, что ищет ОП.

От 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

Я прошу отличить. Посмотрите мой примерный код. Это невозможно сделать из кода блока вызывающего, но это можно сделать из кода Swing, хранящегося в JOptionPane. –

+0

@Hovercraft - согласился. Я забыл параметр «JOptionPane», который позволяет вам передать свой собственный «компонент» для рендеринга. –

-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, но, кроме того, это необязательно. –

+0

Проголосовало за то, что теперь вы даете образец кода, который нарушает правило однопоточности Swing, а не хорошо. Я рекомендую вам удалить этот ответ. –

+0

@Hovercraft Full Of Eels: Я считаю, что Swing принимает некоторые дополнительные меры безопасности при создании новых окон, поэтому запуск нескольких потоков, создающих диалоговые окна, в порядке, поскольку только одно модальное окно будет получать события swing. Нужно быть осторожным, но это можно сделать. –

Смежные вопросы