java JOptionPane 上的 ActionListener

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12828389/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 10:22:43  来源:igfitidea点击:

ActionListener on JOptionPane

javaswingjdialogjoptionpane

提问by user1521881

I am following the Oracle tutorial on how to create a custom dialog box: http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

我正在关注有关如何创建自定义对话框的 Oracle 教程:http: //docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

I have two buttons: Save Object and Delete Object which when clicked should execute a certain piece of code. Unfortunately I can't seem to add any ActionListener to the JOptionPane buttons so when they're clicked nothing happens.

我有两个按钮:保存对象和删除对象,点击它们时应该执行一段代码。不幸的是,我似乎无法向 JOptionPane 按钮添加任何 ActionListener,因此当它们被点击时什么也没有发生。

Can anyone help tell me how I can go about doing this? Here is the class I have for the dialog box so far:

谁能帮我告诉我如何去做这件事?这是迄今为止我为对话框设置的类:

class InputDialogBox extends JDialog implements ActionListener, PropertyChangeListener {
    private String typedText = null;
    private JTextField textField;

    private JOptionPane optionPane;

    private String btnString1 = "Save Object";
    private String btnString2 = "Delete Object";

    /**
     * Returns null if the typed string was invalid;
     * otherwise, returns the string as the user entered it.
     */
    public String getValidatedText() {
        return typedText;
    }

    /** Creates the reusable dialog. */
    public InputDialogBox(Frame aFrame, int x, int y) {
        super(aFrame, true);

        setTitle("New Object");

        textField = new JTextField(10);

        //Create an array of the text and components to be displayed.
        String msgString1 = "Object label:";

        Object[] array = {msgString1, textField};

        //Create an array specifying the number of dialog buttons
        //and their text.
        Object[] options = {btnString1, btnString2};

        //Create the JOptionPane.
        optionPane = new JOptionPane(array,
                JOptionPane.PLAIN_MESSAGE,
                JOptionPane.YES_NO_OPTION,
                null,
                options,
                options[0]);


        setSize(new Dimension(300,250));
        setLocation(x, y);

        //Make this dialog display it.
        setContentPane(optionPane);
        setVisible(true);

        //Handle window closing correctly.
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                /*
                 * Instead of directly closing the window,
                 * we're going to change the JOptionPane's
                 * value property.
                 */
                optionPane.setValue(new Integer(
                        JOptionPane.CLOSED_OPTION));
            }
        });

        //Ensure the text field always gets the first focus.
        addComponentListener(new ComponentAdapter() {
            public void componentShown(ComponentEvent ce) {
                textField.requestFocusInWindow();
            }
        });

        //Register an event handler that puts the text into the option pane.
        textField.addActionListener(this);

        //Register an event handler that reacts to option pane state changes.
        optionPane.addPropertyChangeListener(this);
    }

    /** This method handles events for the text field. */
    public void actionPerformed(ActionEvent e) {
        optionPane.setValue(btnString1);
        System.out.println(e.getActionCommand());
    }

    /** This method reacts to state changes in the option pane. */
    public void propertyChange(PropertyChangeEvent e) {
        String prop = e.getPropertyName();

        if (isVisible()
         && (e.getSource() == optionPane)
         && (JOptionPane.VALUE_PROPERTY.equals(prop) ||
             JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
            Object value = optionPane.getValue();

            if (value == JOptionPane.UNINITIALIZED_VALUE) {
                //ignore reset
                return;
            }

            //Reset the JOptionPane's value.
            //If you don't do this, then if the user
            //presses the same button next time, no
            //property change event will be fired.
            optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
            if (btnString1.equals(value)) {
                    typedText = textField.getText();
                String ucText = typedText.toUpperCase();
                if (ucText != null ) {
                    //we're done; clear and dismiss the dialog
                    clearAndHide();
                } else {
                    //text was invalid
                    textField.selectAll();
                    JOptionPane.showMessageDialog(
                                InputDialogBox.this,
                                    "Please enter a label",
                                    "Try again",
                                    JOptionPane.ERROR_MESSAGE);
                    typedText = null;
                    textField.requestFocusInWindow();
                }
            } else { //user closed dialog or clicked delete
               // Delete the object ...

                typedText = null;
                clearAndHide();
            }
        }
    }

    /** This method clears the dialog and hides it. */
    public void clearAndHide() {
        textField.setText(null);
        setVisible(false);
    }

回答by MadProgrammer

I think you're missing the point of the JOptionPane. It comes with the ability to show it's own dialog...

我认为你错过了JOptionPane. 它具有显示自己的对话框的能力......

public class TestOptionPane02 {

    public static void main(String[] args) {
        new TestOptionPane02();
    }

    public TestOptionPane02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JTextField textField = new JTextField(10);

                String btnString1 = "Save Object";
                String btnString2 = "Delete Object";

                //Create an array of the text and components to be displayed.
                String msgString1 = "Object label:";
                Object[] array = {msgString1, textField};
                //Create an array specifying the number of dialog buttons
                //and their text.
                Object[] options = {btnString1, btnString2};

                int result = JOptionPane.showOptionDialog(null, array, "", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, "New Object", options, options[0]);
                switch (result) {
                    case 0:
                        System.out.println("Save me");
                        break;
                    case 1:
                        System.out.println("Delete me");
                        break;
                }
            }
        });
    }
}

To do it manually, you're going to have to do a little more work.

要手动完成,您将需要做更多的工作。

Firstly, you're going to have to listen to the panel's property change events, looking for changes to the JOptionPane.VALUE_PROPERTYand ignoring any value of JOptionPane.UNINITIALIZED_VALUE...

首先,您将不得不监听面板的属性更改事件,寻找对...的更改JOptionPane.VALUE_PROPERTY并忽略JOptionPane.UNINITIALIZED_VALUE...的任何值。

Once you detect the change, you will need to dispose of your dialog.

检测到更改后,您将需要处理对话框。

The you will need extract the value that was selected via the JOptionPane#getValuemethod, which returns an Object. You will have to interrupt the meaning to that value yourself...

您将需要提取通过该JOptionPane#getValue方法选择的值,该方法返回一个Object. 您将不得不自己中断该值的含义......

Needless to say, JOptionPane.showXxxDialogmethods do all this for you...

不用说,JOptionPane.showXxxDialog方法为你做这一切......

Now if you worried about having to go through all the setup of the dialog, I'd write a utility method that either did it completely or took the required parameters...but that's just me

现在,如果您担心必须完成对话框的所有设置,我会编写一个实用程序方法来完成它或采用所需的参数......但这只是我

UPDATED

更新

Don't know why I didn't think it sooner...

不知道为什么我没有早点想到......

Instead of passing an array of Stringas the options parameter, pass an array of JButton. This way you can attach your own listeners.

不是传递一个数组String作为选项参数,而是传递一个JButton. 通过这种方式,您可以附加自己的听众。

options - an array of objects indicating the possible choices the user can make; if the objects are components, they are rendered properly; non-String objects are rendered using their toString methods; if this parameter is null, the options are determined by the Look and Feel

options - 一组对象,指示用户可以做出的可能选择;如果对象是组件,它们会被正确渲染;非字符串对象使用它们的 toString 方法呈现;如果此参数为空,则选项由外观决定

回答by loveToCode

For the flexibility you seem to want you should have your class extend JFrame instead of JDialog. Then declare your buttons as JButtons: JButton saveButton = new JButton("Save"); and add an actionListnener to this button: saveButton.addActionListener(); either you can put a class name inside the parenthesis of the saveButton, or you can simply pass it the keyword 'this' and declare a method called actionPerformed to encapsulate the code that should execute when the the button is pressed. See this link for a JButton tutorial with more details: http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

为了您似乎想要的灵活性,您应该让您的类扩展 JFrame 而不是 JDialog。然后将您的按钮声明为 JButton: JButton saveButton = new JButton("Save"); 并向该按钮添加一个 actionListnener: saveButton.addActionListener(); 您可以将类名放在 saveButton 的括号内,或者您可以简单地将关键字“this”传递给它并声明一个名为 actionPerformed 的方法来封装按下按钮时应执行的代码。有关更多详细信息,请参阅此链接以获取 JButton 教程:http: //docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html