我有一个用.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
的扩展,其中包含JScrollPane
和JTable
及其自己的单元格渲染器和自定义模型(如果可用,则源here您想要的。)
我想我可以从OpenBookPanel
对象中爬到对象树上并进入周围的对话框,但是我该怎么办?
答案 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);
}
}
}
});