如何双击子控件使JOptionPane本身“确定”

时间:2018-09-28 09:55:27

标签: java swing dialog

我有一个用.showConfirmDialog创建的JOptionPane。在其中的JPanel包含“东西”(实际上是用于选择要打开的项目的自定义项目浏览器)。

一切正常-我选择一个要打开的项目,然后按OK,然后可以从调用类中获得所选的项目。太完美了。

但是,我想要做的是能够双击一个项目,然后为我按面板上的“确定”。事情的双击面没有问题。我无法解决的问题是如何使它按OK键。

我使用以下方法创建对话框:

OpenBookPanel info = new OpenBookPanel();
int r = JOptionPane.showConfirmDialog(this, info, "Open Book", JOptionPane.OK_CANCEL_OPTION);
if (r == JOptionPane.OK_OPTION) {
    ... etc ...

并且OpenBookPanel只是JPanel的扩展,其中包含JScrollPaneJTable及其自己的单元格渲染器和自定义模型(如果可用,则源here您想要的。)

我想我可以从OpenBookPanel对象中爬到对象树上并进入周围的对话框,但是我该怎么办?

1 个答案:

答案 0 :(得分:1)

在尝试的过程中,我偶然偶然发现了答案(文档中没有记录...)

第一步是走到树上,找到JOptionPane对象。这是在MouseEvent侦听器中寻找双击的地方:

Component c = (Component)OpenBookPanel.this;
while ((c != null) && (!(c instanceof JOptionPane))) {
    c = c.getParent();
}

如果c不是null,那么您已经找到JOptionPane。这样您就可以正确投射它。

现在神奇了。 JOptionPane有一个setValue方法:

  

public void setValue(Object newValue)

     

设置用户选择的值。

     

参数:

     

newValue-所选值

     

另请参见:

     

getValue()

使用JOptionPane.OK_OPTION进行调用以设置您要选择的选项的值。现在-文档不要提到的是它不仅设置了值:还主动选择了值。就像用户实际与对话框进行交互以选择选项一样。使用该功能设置值后,对话框将关闭,并返回所选值。

这是我完成的MouseEvent侦听器,以供参考:

table.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        if (e.getClickCount() == 2 && table.getSelectedRow() != -1) {
            Component c = (Component)OpenBookPanel.this;
            while ((c != null) && (!(c instanceof JOptionPane))) {
                c = c.getParent();
            }
            if (c == null) {
                System.err.println("Could not get option pane!");
            } else {
                JOptionPane op = (JOptionPane)c;
                op.setValue(JOptionPane.OK_OPTION);
            }
        }
    }
});