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

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

【问题讨论】:

    标签: java swing jframe jdialog joptionpane


    【解决方案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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-11-15
              • 2017-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-24
              • 2017-05-13
              相关资源
              最近更新 更多