Java:文件菜单点击是否会聚焦?

Java:文件菜单点击是否会聚焦?,java,swing,focus,jtable,Java,Swing,Focus,Jtable,我对表格有一个问题,即正在编辑的单元格在用户按下enter或tab键之前不会存储其新值,而我希望它在焦点丢失时立即提交该值,因为我发现编辑单元格时选择“文件->保存”会导致该单元格的数据丢失。 我发现你可以简单地设置 table.putClientProperty(“terminateEditOnFocusLost”,Boolean.TRUE) 除了选择“文件”菜单时,该选项适用于每次焦点更改,在这种情况下,单元格将保持在编辑模式。 我的问题是,设置此属性的行为是否不像人们预期的那样,或者在Ja

我对表格有一个问题,即正在编辑的单元格在用户按下enter或tab键之前不会存储其新值,而我希望它在焦点丢失时立即提交该值,因为我发现编辑单元格时选择“文件->保存”会导致该单元格的数据丢失。 我发现你可以简单地设置

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并在构建时添加一个侦听器。至于其他的问题,我想它们几乎使修复变得多余了……我试着通过键入而不是正式调用编辑器来编辑单元格,它似乎仍然可以正常工作,尽管我知道这很难得出结论,也不能代表每个平台上的每种情况。你能给我一个更可靠的建议吗?