4

カスタムダイアログボックスの作成方法に関するOracleチュートリアルに従っています:http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

2つのボタンがあります。[オブジェクトの保存]と[オブジェクトの削除]をクリックすると、特定のコードが実行されます。残念ながら、JOptionPaneボタンにActionListenerを追加できないようです。そのため、ボタンをクリックしても何も起こりません。

誰かが私がこれを行う方法を教えてもらえますか?これまでのダイアログボックスのクラスは次のとおりです。

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

2 に答える 2

13

私はあなたがのポイントを逃していると思います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;
                }
            }
        });
    }
}

手動で行うには、もう少し作業を行う必要があります。

まず、パネルのプロパティ変更イベントをリッスンし、への変更を探し、...JOptionPane.VALUE_PROPERTYの値を無視する必要があります。JOptionPane.UNINITIALIZED_VALUE

変更を検出したら、ダイアログを破棄する必要があります。

メソッドを介して選択された値を抽出する必要があります。JOptionPane#getValueこれにより、が返されますObject。その値の意味を自分で中断する必要があります...

言うまでもなく、JOptionPane.showXxxDialogメソッドはあなたのためにこれをすべて行います...

ダイアログのすべてのセットアップを実行する必要があることを心配している場合は、完全に実行するか、必要なパラメーターを取得するユーティリティメソッドを作成します...しかし、それは私だけです

更新しました

なぜ早く考えなかったのかわからない...

Stringオプションパラメータとしての配列を渡す代わりに、の配列を渡しますJButton。このようにして、独自のリスナーをアタッチできます。

options-ユーザーが選択できる可能性のあるオブジェクトを示すオブジェクトの配列。オブジェクトがコンポーネントの場合、適切にレンダリングされます; 非文字列オブジェクトは、toStringメソッドを使用してレンダリングされます。このパラメータがnullの場合、オプションはルックアンドフィールによって決定されます

于 2012-10-10T22:14:09.243 に答える
0

柔軟性を持たせたいと思われる場合は、クラスでJDialogではなくJFrameを拡張する必要があります。次に、ボタンをJButtonとして宣言します。JButtonsaveButton = new JButton( "Save"); そして、このボタンにactionListnenerを追加します。saveButton.addActionListener(); saveButtonの括弧内にクラス名を入れるか、キーワード'this'を渡して、ボタンが押されたときに実行されるコードをカプセル化するactionPerformedというメソッドを宣言することができます。詳細については、次のリンクを参照してください: http: //docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

于 2012-10-10T22:33:37.643 に答える