从 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 a JOptionPane automatically after a specified timeout(和另一个example) Control the button state,基于对话框的输入(以及略微改进的 example)

JOptionPane 是一个不错的选择,但它不是您唯一的选择。您可以推出自己的“工厂”(如 JOptionPane),它完成了构建 JDialog、生成按钮/选项和处理用户输入(在这些操作上)的所有繁重工作

【讨论】:

以上是关于从 JPanel 创建自定义对话框的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4:创建返回参数的自定义对话框

从“搜索和替换”对话框中清除自定义查找条目

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

如何在 VSCode 中创建自定义对话框?

如何创建自定义组件并将其添加到基于对话框的应用程序 (MFC)?

从应用程序对话框访问的 MFC 自定义键盘 DLL