从 JPanel 创建自定义对话框
Posted
技术标签:
【中文标题】从 JPanel 创建自定义对话框【英文标题】:create a custom dialog from a JPanel 【发布时间】:2022-01-24 01:53:27 【问题描述】:我想从 JPanel 创建一个对话框,我遇到的问题是 Dialog 类和 JOptionPane 类是我读到的关于使用模板的主要对话框类(一个例子是你的“文本”,然后取消和确认按钮)。我想创建一个包含我的 JPanel 的自定义对话框。我本质上想在屏幕上显示整个 JPanel,而不需要制作新的 JFrame 或重用现有的。
谢谢!
【问题讨论】:
如果您不想使用***容器,您可以考虑使用 CardLayout:docs.oracle.com/javase/tutorial/uiswing/layout/card.html,其中您的对话框是其中一张卡片,而您show
该卡片当对话框应该是可见的。
创建一个工厂类来满足您的需求 - 如果您愿意深入研究,JOptionPane 会非常灵活
@MadProgrammer 我尝试使用 JOptionPane 执行此操作,但我的 JPanel 不适合对话框 gui。即使我调整它的大小,它也会放在屏幕底部,你甚至看不到它。我想我想要的是 JFileChooser 对话框之类的东西。
我们真的需要minimal reproducible example
JDialog
是***容器,就像 JFrame
。您将一个或多个JPanels
添加到默认BorderLayout
。当您创建自己的JDialog
时,您有责任创建您需要的任何JButtons
,
【参考方案1】:
在大多数情况下,JOptionPane
非常灵活,例如,从...开始这样简单的事情
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class TestPane extends JPanel
public TestPane()
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(32, 32, 32, 32));
JLabel label = new JLabel("Hello world");
label.setFont(label.getFont().deriveFont(32f));
add(label);
我能做到……
JOptionPane.showMessageDialog(null, new TestPane());
啊,但是等等,你可能不想要这个图标,所以你可以做类似...
JOptionPane.showMessageDialog(null, new TestPane(), "Hello", JOptionPane.PLAIN_MESSAGE);
...你是什么意思,你想要自定义选项?!嗯,好吧,JOptionPane
也可以处理...
String[] options = new String[]
"options",
"your",
"are",
"These"
;
int result = JOptionPane.showOptionDialog(null, new TestPane(), "Hello", JOptionPane.NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[3]);
if (result >= 0)
System.out.println(options[result]);
现在,只要稍加思考和努力,您还可以:
Close aJOptionPane
automatically after a specified timeout(和另一个example)
Control the button state,基于对话框的输入(以及略微改进的 example)
JOptionPane
是一个不错的选择,但它不是您唯一的选择。您可以推出自己的“工厂”(如 JOptionPane
),它完成了构建 JDialog
、生成按钮/选项和处理用户输入(在这些操作上)的所有繁重工作
【讨论】:
以上是关于从 JPanel 创建自定义对话框的主要内容,如果未能解决你的问题,请参考以下文章
自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?