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


如何将侦听器附加到选项窗格按钮,以在用户单击某些按钮时做出反应?

最佳答案

JOptionPane并不是要嵌入在JFrame中,而是要显示在对话框中。

现在,我看到三种实现您想要的方法:


递归扫描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();
            }
        });
    }
}

关于java - 嵌入时是否监听JOptionPane事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15225755/

10-13 03:25