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不是要嵌入到 aJFrame中,而是要显示在对话框中。

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

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

  2. JOptionPane.setValue(Object object)单击按钮时调用的覆盖。

  3. 更新只需添加一个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();
            }
        });
    }
}
于 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.YESJOptionPane.CANCEL
尽管如此,我认为您需要创建一个常规的JPanel,因为JOptionPane它是用于弹出对话框,而不是嵌入到JFrame.
你看,即使你可以,这并不意味着你应该做某事。

于 2013-03-05T14:19:10.927 回答