Кто-нибудь знает, как у нас есть диалог JOptionPane над другим диалогом JOptionPane?Возможно ли иметь несколько диалогов JOptionPane?
ответ
Я бы использовал 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);
}
}
РЕДАКТИРОВАТЬ: @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;
}
}
Я прошу отличить. Посмотрите мой примерный код. Это невозможно сделать из кода блока вызывающего, но это можно сделать из кода Swing, хранящегося в JOptionPane. –
@Hovercraft - согласился. Я забыл параметр «JOptionPane», который позволяет вам передать свой собственный «компонент» для рендеринга. –
Вы пробовали это и столкнулись с какой-то проблемой, или вы просто спрашиваете? 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();
}
Но только один диалоговые сообщение будет иметь возможность получать свинг событие. Вам придется закрыть их в том порядке, в котором они появились (что является случайным).
Многопоточность будет плохой идеей, так как весь код Swing должен вызываться из того же потока, EDT, но, кроме того, это необязательно. –
Проголосовало за то, что теперь вы даете образец кода, который нарушает правило однопоточности Swing, а не хорошо. Я рекомендую вам удалить этот ответ. –
@Hovercraft Full Of Eels: Я считаю, что Swing принимает некоторые дополнительные меры безопасности при создании новых окон, поэтому запуск нескольких потоков, создающих диалоговые окна, в порядке, поскольку только одно модальное окно будет получать события swing. Нужно быть осторожным, но это можно сделать. –
- 1. Возможно ли иметь несколько viewEngine.viewExtension
- 2. Возможно иметь несколько FilterAttributes?
- 3. Возможно иметь несколько SqlCommand?
- 4. Возможно ли иметь несколько потоков STDIN?
- 5. Возможно ли иметь несколько масок с клипом?
- 6. Возможно ли иметь несколько подключений к gdbserver?
- 7. Возможно ли иметь несколько loadChildrens в маршрутизаторе?
- 8. Возможно ли иметь несколько «TestClass'es» в MSTest?
- 9. Возможно ли иметь несколько значений для узла?
- 10. Возможно ли иметь несколько переменных «request: URLRequest»
- 11. Возможно ли иметь несколько партикулов для записи?
- 12. Возможно ли иметь несколько экземпляров сетки кендо
- 13. Возможно ли иметь несколько куч в java?
- 14. Возможно ли иметь несколько UIView внутри UIPageViewController
- 15. Возможно ли иметь несколько кнопок управления. Tag
- 16. Возможно ли иметь несколько непрозрачности в окне?
- 17. Возможно ли иметь несколько размеров настраиваемых наборов?
- 18. Возможно ли иметь несколько экземпляров статических переменных
- 19. iPhone SDK - возможно ли иметь несколько заставки?
- 20. Возможно ли иметь несколько версий py3?
- 21. Возможно ли иметь несколько паролей с хранилищем
- 22. MaterialDesign несколько диалогов
- 23. Возможно ли установить несколько экземпляров Apache или иметь несколько php.ini?
- 24. Как объединить несколько диалогов?
- 25. несколько диалогов внутри одного dfm
- 26. Возможно ли иметь прозрачную рамку?
- 27. Невозможно показать несколько диалогов
- 28. jQuery несколько модальных диалогов
- 29. Несколько divs и несколько диалогов
- 30. Возможно ли иметь общий делегат?
Вы просто предложили ... да, вы сделали ;-) Интересный способ добиться чего-то, что может быть то, что искали OP. – Howard
действительно сумасшедший, странный ... +1 – mKorbel
это здорово, кстати, почему это работает? Все диалоги не являются модальными? – Pacerier