编程语言
首页 > 编程语言> > java-如何在不触发侦听器的情况下从PropertyChangeListener更改JOptionPane的值?

java-如何在不触发侦听器的情况下从PropertyChangeListener更改JOptionPane的值?

作者:互联网

我正在尝试制作一个程序来管理一组体育运动员.每个球员都有一个枚举Sport,SportManager具有便捷的工厂方法.我想做的是打开一个对话框,该对话框具有一个名称的JTextField和一个选择运动的组合框.但是,我想阻止用户在文本字段为空白时关闭对话框,因此我编写了一个PropertyChangeListener,以便在文本字段为空白时会发出哔哔声以告知用户.但是,如果用户在发出哔声后在文本中添加了某些内容,则它不会触发侦听器,并且您不能在不按Cancel的情况下关闭对话框,因为该值已经是JOptionPane.OK_OPTION,而cancel是唯一的方法更改JOptionPane.VALUE_PROPERTY.所以我尝试添加

message.setValue(JOptionPane.UNITIALIZED_VALUE);

在听众内.但是,这只是立即关闭了窗口,而没有给用户提供填充文本字段的机会,大概是因为它触发了我刚刚注册的侦听器.我如何使它发出不止一次的哔哔声并为用户提供填写该字段的机会?

FYI newPlayer是我要向其注册操作的组件.

码:

    newPlayer.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                Object[] msg = new Object [4];
                msg[0]  = new JLabel("Name:");
                final JTextField nameField = new JTextField();
                msg[1]=nameField;
                msg[2] = new JLabel("Sport: ");
                JComboBox<Sport> major = new JComboBox<Sport>(SportManager.getAllSports());
                msg[3]=major;
                final JOptionPane message = new JOptionPane();
                message.setMessage(msg);
                message.setMessageType(JOptionPane.PLAIN_MESSAGE);
                message.setOptionType(JOptionPane.OK_CANCEL_OPTION);
                final JDialog query = new JDialog(gui,"Create a new player",true);
                query.setContentPane(message);
                query.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                message.addPropertyChangeListener(
                        new PropertyChangeListener() {
                            public void propertyChange(PropertyChangeEvent e) {
                                String prop = e.getPropertyName();


                                if (query.isVisible()&& (e.getSource() == message)&& (prop.equals(JOptionPane.VALUE_PROPERTY))) {
                                    if(nameField.getText().equals("")&&message.getValue().equals(JOptionPane.OK_OPTION)){
                                        Toolkit.getDefaultToolkit().beep();
                                        message.setValue(JOptionPane.UNINITIALIZED_VALUE);
                                        return;
                                    }
                                    query.dispose();
                                }
                            }

                        });
                query.pack();
                query.setVisible(true);
                if(Integer.parseInt(message.getValue().toString())==JOptionPane.OK_OPTION){
                    players.add(new Player(nameField.getText(),(Sport)major.getSelectedItem()));
                    edited=true;
                }
                gui.show(players);
            }
        });

解决方法:

我认为您无法使用JOptionPane做到这一点,但可以使用TaskDialog框架和其他一些工具.

您也可以自己创建一个对话框,将更改侦听器附加到您的字段,然后根据字段的内容启用/禁用“确定”按钮.此过程通常称为“表单验证”

标签:joptionpane,jdialog,swing,java
来源: https://codeday.me/bug/20191102/1990540.html