java - 如何通过双击从子小部件创建 JOptionPane "OK"本身

标签 java swing dialog

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

一切正常 - 我选择一个要打开的项目,然后按“确定”,我可以从调用类中获取所选项目。这一切都很完美。

但是,我想要做的是能够双击一个项目并让它在面板上为我按下“确定”。双击方面不是问题。我不知道如何让它执行 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 的扩展,包含一个 JScrollPane 和一个带有自己的单元格渲染器的 JTable和自定义模型(源可用here如果你想要的话)。

我想我可以沿着对象树向上走,从 OpenBookPanel 对象内到达周围的对话框,但是我会做什么呢?

最佳答案

在实验时,我偶然发现了答案(它没有记录在文档中......)

第一步是沿着树向上查找 JOptionPane 对象。这是在寻找双击的 MouseEvent Listener 中:

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

如果c不是null那么您就找到了JOptionPane。这样您就可以正确地转换它。

现在是神奇的部分。 JOptionPane 有一个 setValue 方法:

public void setValue(Object newValue)

Sets the value the user has chosen.

Parameters:

newValue - the chosen value

See Also:

getValue()

使用JOptionPane.OK_OPTION调用它来设置您要选择的选项的值。现在 - 文档没有提到的是它不只是设置值:它主动选择值。它的作用就好像用户实际上与对话框交互来选择选项一样。当您使用该函数设置值时,对话框将关闭并返回所选值。

这是我完成的 MouseEvent Listener 供引用:

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

关于java - 如何通过双击从子小部件创建 JOptionPane "OK"本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52552765/

相关文章:

java - 无法通过 ReflectionUtils.setField 设置字段值

java - JPanel 周围的数字; JPanel边框?

java - 更改 Jframe 形状

javascript - 在 Dynamics 2011 中调用对话框并将多个 recordID 传递给它

java - Hibernate 无法使用 cascade all 保存子对象

java - 关于按顺序连接线程

java - Eclipse RCP 中 ContainerSelectionDialog 内的 JFace 选项卡

jsf - 创建主从表和对话框,如何重复使用相同的对话框进行创建和编辑

java - 在堆中创建的抽象类的私有(private)实例变量在哪里?

java - 如何在 JPanel 中放置带有 jmathplot 图的 JFrame