Java:文件菜单点击是否会聚焦?
我对表格有一个问题,即正在编辑的单元格在用户按下enter或tab键之前不会存储其新值,而我希望它在焦点丢失时立即提交该值,因为我发现编辑单元格时选择“文件->保存”会导致该单元格的数据丢失。 我发现你可以简单地设置Java:文件菜单点击是否会聚焦?,java,swing,focus,jtable,Java,Swing,Focus,Jtable,我对表格有一个问题,即正在编辑的单元格在用户按下enter或tab键之前不会存储其新值,而我希望它在焦点丢失时立即提交该值,因为我发现编辑单元格时选择“文件->保存”会导致该单元格的数据丢失。 我发现你可以简单地设置 table.putClientProperty(“terminateEditOnFocusLost”,Boolean.TRUE) 除了选择“文件”菜单时,该选项适用于每次焦点更改,在这种情况下,单元格将保持在编辑模式。 我的问题是,设置此属性的行为是否不像人们预期的那样,或者在Ja
table.putClientProperty(“terminateEditOnFocusLost”,Boolean.TRUE)代码>
除了选择“文件”菜单时,该选项适用于每次焦点更改,在这种情况下,单元格将保持在编辑模式。
我的问题是,设置此属性的行为是否不像人们预期的那样,或者在Java中,默认情况下,焦点对菜单项的工作方式是否有所不同?如果查看JMenuItem源代码,会对initFocusability()
进行函数调用,witch依次调用setFocusable(false)
用于initFocusability()的Java文档
初始化将JMenuItem
的焦点斜体化。
JMenuItem
是可聚焦的,但子类可能希望,
这为他们提供了调用其他东西或什么都不调用的机会。
有关动机,请参阅{@linkjavax.swing.jmen#initFocusability}
这个
Java文档来自
被压倒什么也不做。我们希望JMenu是可聚焦的,但是JMenuItem
不想这样,所以我们什么都不做。我们不调用
在super的构造函数完成后设置为可聚焦(true),因为
JMenu将被视为可通过
键盘,这是我们不想要的。使组件可由
调用setFocusable(true)后的键盘和setFocusable一样正常
新的API和规范是这样的,但在内部我们不想使用它
像这样,我们改变了键盘的可遍历性
因此,听起来您需要调用setFocusable(true)代码>如果不想使菜单项可聚焦,则需要在保存操作中添加如下代码:
if (table.isEditing())
table.getCellEditor().stopCellEditing();
我发现上面两个答案的结合解决了这个问题。我有一个可聚焦的菜单栏,并添加了一个DefaultCellEditor
,其中包含一个覆盖的getTableCellEditorComponent
方法,该方法添加了一个聚焦侦听器以停止编辑:
table.setDefaultEditor(String.class, new DefaultCellEditor(new JTextField()){
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column)
{
Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);
c.addFocusListener(new FocusListener()
{
public void focusGained(FocusEvent e)
{
}
public void focusLost(FocusEvent e)
{
stopCellEditing();
}
});
return c;
}
});
嗯,这听起来不错,但我试过了,似乎没用。在调用SetFocusable之前,我还尝试在我的菜单上调用IsFocusable,但不管怎样,这似乎已经是真的了。不要因为在起居室感觉冷而烧掉床:-)或者换句话说:通常,ui流依赖于菜单/项的数量只是临时的焦点所有者。不要为了一个未解决的问题而混淆它!我以前试过,但有一些意想不到的行为,但我又尝试了另一种方式,现在似乎奏效了。如果我不能保证我的表将只处理字符串,那会很烦人,但幸运的是它会。我将在下面发布代码。不够安全-编辑组件甚至可能没有编辑的重点。此外,即使有,如果组件通常是复合组件(如f.i.组合框),侦听器也无法启动,当您想要防止编辑数据丢失时,依赖焦点事件不是一个好主意:围绕编辑的实际焦点转移往往非常不明确。-1根据Kleopatra的注释展开编辑器仅在双击单元格或使用F2调用编辑器时才获得焦点。当单元格有焦点时,没有什么可以阻止用户简单地键入文本。在这种情况下,文本会附加到编辑器中,而编辑器不会获得焦点,因此代码不会执行。此外,每次调用编辑器时,这段代码都会向编辑器组件添加一个新的FocusListener。我现在修改了代码,这样我就有了自己的编辑器,可以扩展DefaultCellEditor并在构建时添加一个侦听器。至于其他的问题,我想它们几乎使修复变得多余了……我试着通过键入而不是正式调用编辑器来编辑单元格,它似乎仍然可以正常工作,尽管我知道这很难得出结论,也不能代表每个平台上的每种情况。你能给我一个更可靠的建议吗?