Java - 如何创建自定义对话框?

Posted

技术标签:

【中文标题】Java - 如何创建自定义对话框?【英文标题】:Java - How to create a custom dialog box? 【发布时间】:2010-10-21 19:55:45 【问题描述】:

我在 JFrame 上有一个按钮,单击该按钮时我希望弹出一个对话框,其中包含多个文本区域供用户输入。我一直在四处寻找,试图弄清楚如何做到这一点,但我越来越困惑。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

如果您不需要太多的自定义行为方式,JOptionPane 是一个很好的节省时间的方法。它负责确定/取消选项的放置和本地化,并且是一种快速而简单的方式来显示自定义对话框,而无需定义您自己的类。大多数情况下,JOptionPane 中的“消息”参数是一个字符串,但您也可以传入一个 JComponent 或 JComponent 数组。

例子:

JTextField firstName = new JTextField();
JTextField lastName = new JTextField();
JPasswordField password = new JPasswordField();
final JComponent[] inputs = new JComponent[] 
        new JLabel("First"),
        firstName,
        new JLabel("Last"),
        lastName,
        new JLabel("Password"),
        password
;
int result = JOptionPane.showConfirmDialog(null, inputs, "My custom dialog", JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) 
    System.out.println("You entered " +
            firstName.getText() + ", " +
            lastName.getText() + ", " +
            password.getText());
 else 
    System.out.println("User canceled / closed the dialog, result = " + result);

【讨论】:

不幸的是,此示例不支持例如在字段之间切换或按 Enter 键“确定”。 您可以通过使用构造函数创建 JOptionPane,然后在生成的 JOptionPane 上调用 createDialog 来获得对对话框的更多控制。这为您提供了一个 JDialog,您可以在使其可见之前对其进行进一步自定义。但在某些时候,滚动您自己的自定义组件会更有意义。 @aioobe 在我的 JRE 中,在我的 JRE 中,使用 Tab 键和按 Enter 键都可以正常工作(尽管自您发表评论以来已经过了很长时间)。但是,此解决方案还有另一个缺点:无法区分按下 OK 按钮和关闭对话框窗口。因此无法取消您的操作。 @Vic,您可以使用 JOptionPane.showConfirmDialog 代替 JOptionPane.showMessageDialog。我已经更新了示例,谢谢!【参考方案2】:

试试这个简单的类来自定义你喜欢的对话框:

import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRootPane;

public class CustomDialog

    private List<JComponent> components;

    private String title;
    private int messageType;
    private JRootPane rootPane;
    private String[] options;
    private int optionIndex;

    public CustomDialog()
    
        components = new ArrayList<>();

        setTitle("Custom dialog");
        setMessageType(JOptionPane.PLAIN_MESSAGE);
        setRootPane(null);
        setOptions(new String[]  "OK", "Cancel" );
        setOptionSelection(0);
    

    public void setTitle(String title)
    
        this.title = title;
    

    public void setMessageType(int messageType)
    
        this.messageType = messageType;
    

    public void addComponent(JComponent component)
    
        components.add(component);
    

    public void addMessageText(String messageText)
    
        JLabel label = new JLabel("<html>" + messageText + "</html>");

        components.add(label);
    

    public void setRootPane(JRootPane rootPane)
    
        this.rootPane = rootPane;
    

    public void setOptions(String[] options)
    
        this.options = options;
    

    public void setOptionSelection(int optionIndex)
    
        this.optionIndex = optionIndex;
    

    public int show()
    
        int optionType = JOptionPane.OK_CANCEL_OPTION;
        Object optionSelection = null;

        if(options.length != 0)
        
            optionSelection = options[optionIndex];
        

        int selection = JOptionPane.showOptionDialog(rootPane,
                components.toArray(), title, optionType, messageType, null,
                options, optionSelection);

        return selection;
    

    public static String getLineBreak()
    
        return "<br>";
    

【讨论】:

【参考方案3】:

Java 教程中的This lesson 详细解释了每个 Swing 组件,并附有示例和 API 链接。

【讨论】:

【参考方案4】:

如果你使用NetBeans IDE(目前最新版本是6.5.1),你可以使用它来创建一个基本的GUI java应用程序,使用File->New Project并选择Java类别然后选择Java Desktop Application。

创建后,您将拥有一个简单的基本 GUI 应用程序,其中包含一个可以使用菜单选择打开的关于框。您应该能够根据自己的需要进行调整,并了解如何通过单击按钮打开对话框。

您将能够直观地编辑对话框。删除那里的项目并添加一些文本区域。如果您遇到困难,请尝试一下并提出更多问题:)

【讨论】:

【参考方案5】:

好吧,您实际上是创建一个 JDialog,添加您的文本组件并使其可见。如果您缩小您遇到问题的具体部分,这可能会有所帮助。

【讨论】:

【参考方案6】:

我创建了一个自定义对话框 API。在这里查看https://github.com/MarkMyWord03/CustomDialog。它支持消息和确认框。类似 joptionpane 中的输入和选项对话框即将实现。

来自 CUstomDialog API 的示例错误对话框: CustomDialog Error Message

【讨论】:

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

如何使用自定义布局创建对话框弹出窗口?

如何创建传递参数的自定义Facebook共享对话框?

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

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

WINCC-如何使用自定义的对话框实现用户登录

自定义对话框片段