【问题标题】:Creating a JOptionPane with custom actions on buttons使用按钮上的自定义操作创建 JOptionPane
【发布时间】:2017-10-27 19:21:18
【问题描述】:

我正在尝试使用来自用户的输入创建一个自定义对话框,在每个步骤(输入)之后验证信息,如果正确,则会出现一个新面板,用户可以继续添加信息。为此,我正在使用 JOptionPane。我将有三个按钮“确定”,仅当用户通过整个输入过程“下一步”才启用,以检查输入的信息是否正确并显示一个新窗格,最后是“取消”,以取消。如下所示:

现在如果我点击任何一个按钮,对话框就会关闭,我应该如何改变它?

到目前为止我的代码(大部分):

public MakeBookingForm()
{
    components = new ArrayList<>();

    this.title = "Make Booking";
    setMessageType(JOptionPane.PLAIN_MESSAGE);
    setRootPane(null);
    setOptions(new String[] { "OK", "Next", "Cancel" });
    setOptionSelection(0);

    JPanel roomNumPanel = new JPanel();
    lblRoomNum = new JLabel( "Enter the booking number" );
    roomNumPanel.add(lblRoomNum);
    txtFldRoomNum = new JTextField(20);
    roomNumPanel.add(txtFldRoomNum);
    this.addComponent(roomNumPanel);

}

public void show() //the function i use to show the form
{
    int optionType = JOptionPane.OK_CANCEL_OPTION;
    //JOptionPane.OK_OPTION
    Object optionSelection = null;

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

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

    System.out.println(selection);

    //return selection;
}

【问题讨论】:

标签: java swing joptionpane


【解决方案1】:

JOptionPane 对按钮应该做什么有自己的概念,您可以通过OK_CANCEL_OPTION 进行设置。所有选项都会导致弹出窗口关闭。从技术上讲,您可以动态获取组件列表,找到 JOptionPane 创建的按钮,删除默认处理程序,然后添加您自己的...但这似乎是一种复杂的方式(与不扩展 @987654324 相比@)。

如果您打算使用 JOptionPane,我建议您创建自己的 JButton 并将它们添加到您创建的 JPanel。这将允许您根据需要设置回调行为。然后告诉 JOptionPane 不显示任何按钮。这可以通过将构造函数的选项参数设置为:new Object[]{} 或调用:setOptions(new Object[]{})

因为不会显示默认按钮,JOptionPane 将自动自动 pack() 本身,只留下您的窗格可见,没有具有不良行为的默认按钮。

【讨论】:

    【解决方案2】:

    因为在显示您的对话框后,您需要检查int selection 以了解用户选择了哪一个?

    我想给你一些简单的例子:

    private int selection;
    private final String password = "12345";
    
    public TestClass() throws MalformedURLException {
    
        Object[] options = {"Enter", "Quit", "Cancel"};
        URL url = new URL("http://education.oracle.com/education/images/wdpsub/java.png");
        ImageIcon icon = new ImageIcon(url);
    
        JPanel panel = new JPanel();
        panel.add(new JLabel("Welcome to my\nJOptionPane example"));
    
        selection = JOptionPane.showOptionDialog(null, panel, "Show me yout skills", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, icon, options, null);
        System.out.println(selection);//print to test which button returns wich value
    
        switch (selection) {
        case 2:
            JOptionPane.showMessageDialog(null, "Your job is cancelled");
            break;
        case 1:
            String answer = JOptionPane.showInputDialog("Are you sure?");
            if(answer.equalsIgnoreCase("YES")) {
                System.exit(0);
            }else {
                JOptionPane.showOptionDialog(null, panel, "Show me yout skills", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, icon, options, null);
            }
    
            break;  
        case 0:
            String keylog = JOptionPane.showInputDialog("Enter your password : ");
            if(keylog.equals(password)) {
                JOptionPane.showMessageDialog(null, "Hello user.");
            }
            break;  
        }
    }
    
    public static void main(String[] args) throws MalformedURLException {
        new TestClass();
    }
    

    注意:这段代码只是为了解释这项工作的逻辑。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多