JOptionPane上的ActionListener [英] ActionListener on JOptionPane

查看:91
本文介绍了JOptionPane上的ActionListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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.

任何人都可以帮我告诉我如何做到这一点?这是我到目前为止对话框的类:

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);
    }


推荐答案

我想你错过了 JOptionPane 的要点。它具有显示自己的对话框的能力...

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

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.

首先,你将不得不听取面板的属性变化事件,寻找的变化JOptionPane.VALUE_PROPERTY 并忽略的任何值JOptionPane.UNINITIALIZED_VALUE ...

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

一次如果检测到更改,则需要处理对话框。

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

您需要提取通过 JOptionPane#getValue选择的值方法,返回对象。你必须自己打断这个值的含义......

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

毋庸置疑, JOptionPane.showXxxDialog 方法为你做这一切...

Needless to say, JOptionPane.showXxxDialog methods do all this for you...

现在如果你担心必须完成对话框的所有设置,我会编写一个实用程序方法,要么就这样做了完全或采取所需的参数...但这只是我

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

更新

不知道为什么我不想早点...

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

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

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


options - 一个对象数组,指示用户
可以做出的选择; 如果对象是组件,则会正确呈现;
非String对象使用其toString方法呈现;如果此
参数为null,则选项由外观确定

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

这篇关于JOptionPane上的ActionListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆