没有人知道我们如何在另一个JOptionPane对话框上面有一个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
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;
}
}
我不同意。请参阅我的示例代码。它不能从调用者块的代码完成,但它可以通过JOptionPane持有的Swing代码完成。 – 2011-05-21 19:36:39
@ Hovercraft - 同意。我忘记了'JOptionPane'选项,它允许你传入你自己的'Component'来渲染。 – 2011-05-21 19:56:05
你有没有试过它,遇到了一些问题,或者你只是问? 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调用,但是这并不是必需的。 – 2011-05-21 19:39:29
向下投票,因为现在您给出了打破Swing单线程规则的示例代码,并不好。我建议你删除这个答案。 – 2011-05-21 19:42:22
@Hovercraft Full Of Eels:我相信Swing在创建新窗口时需要一些额外的安全措施,所以启动几个创建对话框的线程就没问题,因为只有一个模式窗口会接收到swing事件。必须格外小心,但可以完成。 – 2011-05-21 19:43:00
- 1. JOptionPane确认对话框
- 2. 在Java中,您是否可以将多个对话框压缩为一个对话框
- 3. Android:我可以显示多个对话框吗?有没有像对话Z级?
- 4. 是否有可能在Facebook Feed对话框中有多个附件?
- 5. 在Java中是否有多输入JOptionPane?
- 6. JOptionPane showMessageDialog方法是否自动实例化此对话框所需的对象
- 7. 用一句话打印多个JOptionPane字符串输入对话框
- 8. JQuery对话框可以打开另一个JQuery对话框吗?
- 9. 多个对话框
- 10. 是否可以有多个iAds实例?
- 11. 是否可以有多个appveyor.yml配置?
- 12. 是否有可能没有按钮的Grails UI对话框
- 13. 检测是否有对话框打开
- 14. 是否有WPF的颜色对话框?
- 15. 是否可以测试选择框中有多少个选项?
- 16. jquery ui对话框,有多个对话框影响位置
- 17. 是否可以使用IntelliJ插件启动.fxml(对话框)?
- 18. 是否可以从数据库填充列表对话框?
- 19. 是否可以在Service [android app]中显示对话框?
- 20. 是否可以将PDF嵌入到jQuery UI对话框中?
- 21. 是否可以抑制Extendscript中的CheckOut/CheckIn对话框?
- 22. 是否可以将CMFCToolBar添加到对话框中?
- 23. 是否可以更换系统打开文件对话框?
- 24. dijit对话框是否可以在模块创建时关闭
- 25. 是否可以从BrodcastReceiver启动警报对话框?
- 26. 是否可以在wix中添加卸载对话框?
- 27. 是否可以动态更改模态对话框的语言?
- 28. 是否可以在触摸UI对话框中包含文件?
- 29. 是否可以使用JavaScript生成保存文件对话框?
- 30. 是否可以动态更改Rich-Faces对话框的大小?
你刚刚建议...是的,你做了;-)有趣的方式来完成一些可能是OP所寻找的东西。 – Howard 2011-05-21 19:38:56
真的很疯狂,奇怪... +1 – mKorbel 2011-05-21 20:35:26
这是很酷的,btw它为什么会起作用?不是所有的对话都是模态的? – Pacerier 2011-05-23 01:50:38