使用 JPanel 作为 JTable 单元格编辑器时获取焦点问题

2024-02-05

我有一个单元格编辑器,其中包含一个小按钮,可以双击该按钮来弹出编辑对话框,然后是一个可用于内联编辑值的文本字段(需要弹出窗口才能编辑其他值,仅允许编辑第一个显示在 JTable 中)。

当用户单击字段时,一切正常,但如果他们使用 Tab 键进入该字段,则文本字段不会获得焦点,并且除非用鼠标单击该字段,否则他们无法编辑该字段。

我尝试摆弄 jpanel 的各种焦点方法,但没有什么区别,有人知道我做错了什么吗?

package com.jthink.jaikoz.celleditor;

import com.jthink.jaikoz.celldata.Cell;
import com.jthink.jaikoz.guielement.Focus;
import com.jthink.jaikoz.table.CellLocation;
import com.jthink.jaikoz.table.DatasheetToggleButton;
import com.jthink.jaikoz.table.datasheet.Datasheet;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class SimpleMultiRowCellEditor
    extends DefaultCellEditor implements ActionListener
{

    final JPanel panel;
    private final DatasheetToggleButton rowCount;
    Cell value;

    public SimpleMultiRowCellEditor(final JTextField text)
    {
        super(text);
        this.setClickCountToStart(1);

        rowCount = new DatasheetToggleButton();
        rowCount.setVisible(true);
        rowCount.addActionListener(this);
        panel = new JPanel();
        panel.setOpaque(false);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.add(rowCount);
        panel.add(editorComponent);
        /*panel.setFocusable(true);
        panel.setFocusCycleRoot(true);
        ArrayList focusOrder = new ArrayList();
        focusOrder.add(editorComponent);
        focusOrder.add(rowCount);
        focusOrder.add(panel);
        panel.setFocusTraversalPolicy(new Focus(focusOrder));
        */
    }

    public Component getTableCellEditorComponent(
        final JTable table, final Object val, final boolean isSelected,
        final int row, final int column)
    {
        value = (Cell) ((Cell) val).clone();
        rowCount.setText(String.valueOf(value.getValues().size()));
        delegate.setValue(value.getValue());
        return panel;
    }

    public Object getCellEditorValue()
    {
        final String s = (String) delegate.getCellEditorValue();
        value.setValue(s);
        return value;
    }

    public void actionPerformed(final ActionEvent e)
    {
        this.stopCellEditing();
        final CellLocation cl =  Datasheet.getActiveEditSheet()
            .getTable().getSelectedCellLocations().get(0);
        UpdateMultiRowCellDialog.getInstanceOf().display(value,cl);
    }
}

尝试将焦点监听器添加到面板,似乎没有任何区别

class PanelFocusListener implements FocusListener
{
    public void focusGained(FocusEvent e)
    {
        System.out.println("Gained Focus");
        editorComponent.requestFocusInWindow();
    }

    public void focusLost(FocusEvent e)
    {
        System.out.println("Lost Focus");

    }
}

因此,在按 Tab 键进入字段后,我键入一个键,看起来好像获得了焦点,但您无法在该字段中输入任何内容,而如果我键入 RETURN,那么我可以开始编辑该字段,按 RETURN 做什么才能使其工作?


按 RETURN 键有何作用使其能够工作?

如手上所示按键绑定 http://tips4java.wordpress.com/2008/10/10/key-bindings/应用程序,默认ENTER大多数 L&F 中的键绑定是notify-field-accept。目前尚不清楚为什么你的ActionListener begins with stopCellEditing()。我本来希望它会调用fireEditingStopped() after更新数据模型,如本中所建议的example http://sites.google.com/site/drjohnbmatthews/table.

可惜我不熟悉Jaikoz http://www.jthink.net/jaikoz/。你可能会看看概念:编辑器和渲染器 http://download.oracle.com/javase/tutorial/uiswing/components/table.html#editrender以及后续部分的额外指导。

附录:正如您在评论中指出的,JTextField in a DefaultCellEditor默认情况下允许在选定字段中输入内容。从您的示例中尚不清楚该默认值如何被取消。缺席sscce http://sscce.org这说明了问题,您可以将您的代码与此相关的代码进行比较example https://stackoverflow.com/questions/2511415使用子类展示默认行为JTextField.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JPanel 作为 JTable 单元格编辑器时获取焦点问题 的相关文章

随机推荐

  • 如何使用curl 访问IBM 语音转文本API?

    我无法使用curl 访问IBM Bluemix 上的语音转文本API 我尝试了文档中使用curl进行无会话请求的示例 但它不起作用 我收到无效的用户 ID 密码消息 这是我得到的错误 代码 401 错误 未授权 描述 2016 10 08T
  • 如何获取MemberInfo的值?

    我如何获得 a 的值MemberInfo目的 Name返回变量的名称 但我需要该值 我认为你可以这样做FieldInfo但我没有代码片段 如果你知道如何做到这一点 你可以提供一个代码片段吗 Thanks 虽然我总体上同意 Marc 关于不反
  • 数据导入期间超出 Fuseki GC 开销限制

    我正在尝试在启动时将 LinkedMDB 610 万个三元组 导入到我的本地版本的 jena fuseki 中 path to fuseki server file path to linkedmdb nt ds 它运行了一分钟 然后因以下
  • Java:字符串分割

    我有以下字符串 Mr John Smith Dickson lt email protected cdn cgi l email protection gt 我想把它分成三个部分 第1部分 先生第二部分 约翰 史密斯 迪克森第三部分 电子邮
  • 找出特定整数有多少个二进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 计算快速对数以 2 为底的上限 https stackoverflow com questions 3272424 compute fast log base 2 ceiling 在 C C 中 找出
  • 页面性能:从 CDN 加载多个库脚本或将这些库组合并缩小为从服务器下载的一个文件?

    我了解从 CDN 加载 jQuery 等大型通用库的优势 但是较小的插件和库帮助程序 例如 jQuery ui 或 bootstrap 及其帮助程序 又如何呢 我的网站大约有 10 12 个 我是否应该从 cdnjs 中单独选择它们并获得
  • 在 erb 模板中嵌入 ejs 模板

    我正在构建一个 javascript 重的 Rails 3 应用程序 它使用 underscore js 它具有构建在 ejs 之上的非常优雅的模板机制 http embeddedjs com http embeddedjs com 问题
  • Flex:在动作脚本中实现经典的柯里函数?

    在 ActionScript 中以良好的语法实现经典柯里化函数的最佳方法是什么 我试过了 Function prototype curry function return helloWorld trace function void cur
  • VBA 中的 Powerpoint 幻灯片计数变量

    我正在用 vba 创建一个 Powerpoint 我的计划是设置代码 使每个子例程创建特定的幻灯片 但是 我需要将幻灯片编号传递给每个子例程 以便它在正确的位置创建正确的幻灯片 我无法定义 excel vba 中的 Slides Count
  • 在Python中通过FTP代理与ftplib连接?

    我正在尝试从 FTP 下载文件 在家里工作正常 但是当我通过公司网络运行时就无法工作 我知道与代理有关 我看过一些关于 Python 中代理问题的帖子 我尝试建立与代理的连接 url 工作正常 但连接 FTP 时失败 有谁知道如何做到这一点
  • 如何在Docker中支持组播网络

    我在docker中遇到了一个关于网络配置的大问题 情况是这样的 1 我的服务器上有两个 eth eth0 和 eth1 eth0 flags 4163
  • Datareader 在 VS 中没有返回结果,但存储过程在 Sql Server 中返回多个结果集

    我在 Visual Studio 2008 中从数据读取器检索结果时遇到问题 我在同一个数据库中有多个存储过程 我能够从那些不接收输入参数的值中检索值 但是 当我在带有输入参数的存储过程上使用 executreReader 方法时 我得到一
  • MySQL IN 子句是否多次执行子查询?

    给定 MySQL 中的 SQL 查询 SELECT FROM tableA WHERE tableA id IN SELECT id FROM tableB MySQL是否执行子查询SELECT id FROM tableB每行多次tabl
  • 有关 OpenCL 内核编程的教程或书籍? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我认为这个问题足够具体 只是为了说清楚 我不是在寻找参考 而是在寻找教程 我对内核编程方面特别感兴趣 市
  • 如何修复因字节计数长度不正确而损坏的序列化字符串?

    我使用 Hotaru CMS 和图像上传插件 如果我尝试将图像附加到帖子中 则会收到此错误 否则不会出现错误 unserialize function unserialize 偏移处错误 有问题的代码 错误点与 一致 Retrieve su
  • i18next 显示键而不是值

    I have translation json文件输入 locales en app name Example App In html 我有 a href In js document ready function var language
  • Castle:如何在日志拦截器中获取正确的 ILogger?

    如果您在温莎城堡中使用 LoggingFacility 如果您的类中有可选的记录器依赖项 城堡可以将记录器注入其中的 ILogger 属性 容器将自动解析与您的类关联的记录器 但是如果我想使用AOP 拦截器方法 来实现日志记录 我基本上想写
  • SQL 2005 - 多次指定列

    尝试在 SQL 2005 中运行此查询时出现以下错误 SELECT tb FROM SELECT FROM vCodesWithPEs INNER JOIN vDeriveAvailabilityFromPE ON vCodesWithPE
  • 在 ngx-toastr 中找不到模块

    我找不到答案 ERROR in node modules ngx toastr fesm5 ngx toastr js Module not found Error Can t resolve Users vasanthan Mean pr
  • 使用 JPanel 作为 JTable 单元格编辑器时获取焦点问题

    我有一个单元格编辑器 其中包含一个小按钮 可以双击该按钮来弹出编辑对话框 然后是一个可用于内联编辑值的文本字段 需要弹出窗口才能编辑其他值 仅允许编辑第一个显示在 JTable 中 当用户单击字段时 一切正常 但如果他们使用 Tab 键进入