JOptionPane
に埋め込まれることを意図しているのJFrame
ではなく、ダイアログに表示されることを意図しています。
今、私はあなたが望むものを達成するための3つの方法を見ています:
JOptionPane
コンポーネント階層を再帰的にスキャンして、を見つけJButton
て追加しActionListener
ます。このソリューションの欠点は、どのボタンがどのボタンであるかを何らかの方法で特定する必要があることです(コンポーネントの順序はL&Fによって異なる場合があります)。
JOptionPane.setValue(Object object)
ボタンがクリックされたときに呼び出されるオーバーライド。
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();
}
});
}
}