0

JOptionPane次のように、「埋め込み」コンポーネントとして使用できます。

JOptionPane pane = new JOptionPane(message, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
log.debug("Options are: ", pane.getOptions());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(chartPanel, BorderLayout.CENTER);
frame.add(pane, BorderLayout.SOUTH);
frame.pack();
frame.setSize(800, 800);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

ユーザーがボタンをクリックしたときに反応するように、オプションペインのボタンにリスナーをアタッチするにはどうすればよいですか?

4

3 に答える 3

2

JOptionPaneに埋め込まれることを意図しているのJFrameではなく、ダイアログに表示されることを意図しています。

今、私はあなたが望むものを達成するための3つの方法を見ています:

  1. JOptionPaneコンポーネント階層を再帰的にスキャンして、を見つけJButtonて追加しActionListenerます。このソリューションの欠点は、どのボタンがどのボタンであるかを何らかの方法で特定する必要があることです(コンポーネントの順序はL&Fによって異なる場合があります)。

  2. JOptionPane.setValue(Object object)ボタンがクリックされたときに呼び出されるオーバーライド。

  3. UPDATEPropertyChangeListenerの変更をリッスンするを追加するだけJOptionPane.VALUE_PROPERTYです。ボタンを押すたびに通知が届きます。

オプション3が最も適切で、コードの量が最小限であるように思われます。

これがこの2番目のソリューションのスニペットです。これにアクセスするためのより良いメソッドを使用できるように、匿名クラスを内部クラスまたは独自のファイルに拡張してください。

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TestOptionPane {

    protected void initUI() {
        final JFrame frame = new JFrame();
        JOptionPane pane = new JOptionPane("Some message", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) {
            @Override
            public void setValue(Object newValue) {
                super.setValue(newValue);
                JOptionPane.showMessageDialog(frame.getContentPane(), "You have hit " + newValue);
            }
        };
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new JLabel("Some panel in the middle") {
            @Override
            public java.awt.Dimension getPreferredSize() {
                return new Dimension(800, 500);
            };
        }, BorderLayout.CENTER);
        frame.add(pane, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestOptionPane().initUI();
            }
        });
    }
}
于 2013-03-05T14:37:52.180 に答える
0

これはあなたが欲しいです。

    JOptionPane pane = new JOptionPane("Stackoverflow", JOptionPane.QUESTION_MESSAGE,
        JOptionPane.YES_NO_OPTION);

    JPanel buttonArea = (JPanel) pane.getComponents()[1];

    JButton b1 = (JButton)buttonArea.getComponent(0);
    JButton b2 = (JButton)buttonArea.getComponent(1);

    b1.removeActionListener(b1.getActionListeners()[0]);

    b1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Stackoverflow");
        }
    });

    JFrame frame = new JFrame();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setLayout(new BorderLayout());
    frame.add(pane, BorderLayout.SOUTH);

    frame.pack();
    frame.setSize(800, 800);

    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
于 2013-03-05T14:31:46.383 に答える
0

を使用してイベントをキャッチできますpane.showConfirmDialog()。状況に応じて、またはのいずれかで戻りJOptionPane.YESますJOptionPane.CANCEL。それにもかかわらず、ポップアップダイアログ用であり、に埋め込まないため
、従来のを作成する必要があると思います。 ほら、できたとしても、何かをすべきだという意味ではありません。JPanelJOptionPaneJFrame

于 2013-03-05T14:19:10.927 に答える