Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌入时是否侦听JOptionPane事件?_Java_Swing_Actionlistener_Joptionpane - Fatal编程技术网

Java 嵌入时是否侦听JOptionPane事件?

Java 嵌入时是否侦听JOptionPane事件?,java,swing,actionlistener,joptionpane,Java,Swing,Actionlistener,Joptionpane,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_

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

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

您可以使用
窗格.showConfirmDialog()
捕获事件。它将根据情况返回
JOptionPane.YES
JOptionPane.CANCEL

尽管如此,我认为您需要创建一个传统的
JPanel
,因为
JOptionPane
用于弹出对话框,而不是嵌入
JFrame

你看,即使你可以,也不意味着你应该做些什么。

这是你想要的

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

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

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

  • 递归扫描
    JOptionPane
    组件层次结构以查找
    JButton
    并添加
    ActionListener
    。此解决方案的缺点是,您必须以某种方式确定哪个按钮是哪个(组件顺序可能会根据不同的L&F而变化)

  • 重写当单击按钮时调用的
    JOptionPane.setValue(对象对象)

  • 更新只需添加一个
    PropertyChangeListener
    ,它监听
    JOptionPane.VALUE\u属性
    上的更改。每次按下按钮时,您都会收到通知

  • 选项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可以轻松弹出一个标准对话框,提示用户输入值或通知他们一些信息”。JOptionPane并不意味着嵌入到标准JFrame中。顺便说一句,
    frame.pack();框架设置尺寸(800800)是矛盾的。调用
    pack()
    setSize()
    (最好是
    pack()
    )。使用
    JOptionPane
    的构造函数的方法是什么?如果您希望对它们做一些额外的操作,那么@SuzanCioc。从来没必要这么做,但为什么不呢。无论如何,我找到了一个更好的解决办法。我会更新我的答案it@SuzanCioc我已经用第三个更好的解决方案更新了我的答案,这实际上提供了一个能够访问
    JOptionPane的公共构造函数的理由