JOptionPane
不是要嵌入到 aJFrame
中,而是要显示在对话框中。
现在,我看到了实现您想要的 3 种方法:
递归扫描JOptionPane
组件层次结构以查找JButton
和添加ActionListener
. 此解决方案的缺点是您必须以某种方式识别哪个按钮是哪个(组件顺序可能会根据不同的 L&F 变化)。
JOptionPane.setValue(Object object)
单击按钮时调用的覆盖。
更新只需添加一个PropertyChangeListener
监听JOptionPane.VALUE_PROPERTY
. 每次按下按钮时,您都会收到通知。
选项 3 似乎是最合适的并且代码量最少。
这是第二个解决方案的片段。随意将匿名类增强为内部类或什至在其自己的文件中,以便您可以有更好的方法来访问它。
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();
}
});
}
}