如何使用自定义 JTable 单元格编辑器和单元格渲染器

2024-03-05

我创建了一个带有自定义表格渲染和自定义单元格编辑器的 JTable,它给出了图像中的结果

我使用扩展 JPanel 的单独类创建了第一个表格单元格中显示的面板。并将表值添加为,

        tbl.setCellEditor(new customCell());
        tbl.getColumnModel().getColumn(0).setCellRenderer(new customCell());

        DefaultTableModel dtm = (DefaultTableModel) tbl.getModel();

        Vector v = new Vector();
        v.add(new Panel());
        v.add("Test");
        dtm.addRow(v);

        v.clear();
        v.add(new Panel());
        v.add("Test 2");
        dtm.addRow(v);

这是我的表自定义类来创建这个表,

class customCell extends DefaultTableModel implements TableCellRenderer, TableCellEditor {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Panel p = new Panel();            
            table.setRowHeight(row, p.getHeight());
            return p;
        }

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

            return new Panel();
        }

        public Object getCellEditorValue() {
            return "";
        }

        public boolean isCellEditable(EventObject anEvent) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public boolean shouldSelectCell(EventObject anEvent) {
            return true;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        public boolean stopCellEditing() {
            return true;
        }

        public void cancelCellEditing() {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void addCellEditorListener(CellEditorListener l) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        public void removeCellEditorListener(CellEditorListener l) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }

我的问题是认为面板按我的预期显示,我无法在文本字段中输入或更改复选框或单击按钮。请告诉我如何解决这个问题。


我强烈建议重用默认表格渲染器和编辑器中提供的功能,因为您的代码有很多问题

  1. 请拆分您的编辑器、渲染器和表格模型。让他们都在同一个班级真是奇怪
  2. 对于您的渲染器,不要创建新的实例Component每一次。相反,重用相同的组件并只需修改它Component in the getTableCellRendererComponent method
  3. 对于编辑器来说也是如此Component
  4. 扩展默认编辑器而不是实现方法UnsupportedOperationExceptions 或仅返回空Strings

为了支持我的第四点,引用一下编辑部分参与JTable教程 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editor:

如果您想指定文本字段、复选框或组合框以外的编辑器怎么办?由于 DefaultCellEditor 不支持其他类型的组件,因此您必须做更多的工作。您需要创建一个实现 TableCellEditor 接口的类。 AbstractCellEditor 类是一个很好用的超类。它实现了 TableCellEditor 的超级接口 CellEditor,从而省去了您实现单元格编辑器所需的事件触发代码的麻烦。

您的单元格编辑器类需要定义至少两个方法 - getCellEditorValue 和 getTableCellEditorComponent。 CellEditor 需要的 getCellEditorValue 方法返回单元格的当前值。 TableCellEditor 所需的 getTableCellEditorComponent 方法应配置并返回要用作编辑器的组件。

正如那里清楚解释的那样,您必须实现事件触发代码:

为您省去了实现单元格编辑器所需的事件触发代码的麻烦。

你显然忽略了这一点。因此我的建议是从AbstractCellEditor而不是从头开始实现接口

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

如何使用自定义 JTable 单元格编辑器和单元格渲染器 的相关文章

随机推荐

  • 在运行时向窗体上的每个控件添加事件处理程序 VB6

    我有一个 VB6 应用程序 我希望其控件在应用程序范围内具有一致的行为 例如 其中一种行为是在文本框获得焦点时突出显示它 并在失去焦点时删除突出显示 我希望这种情况发生在每一种形式上 我想做的是拥有一个子过程 所有表单在加载时都可以调用该子
  • 监听 JBoss AS 6 中的登录事件

    我有一个在 JBoss AS6 中运行的应用程序 身份验证正在使用 FORM 身份验证方法进行 并且用户正在正确登录 我希望能够在用户成功登录时调用一段自定义的静态代码 不幸的是 我找不到任何侦听器 挂钩或回调 它们将在成功登录时执行代码
  • np.argsort 排除零值

    我有一个数组 0 2 0 0 0 0 3 0 0 0 0 4 我在用着np argsort对值进行排序并获取索引 所以 对于我的例子来说 它会是这样的 1 5 9 2 3 4 6 但是 我只想获取索引数组非零值 仅在我的示例中 1 5 9
  • SailsJS - 将 sails.io.js 与 JWT 结合使用

    我已经实现了一个 AngularJS 应用程序 使用 sails io js 通过 websockets 与 Sails 后端进行通信 由于后端基本上是一个纯 API 并且也会从其他应用程序连接 因此我尝试完全禁用会话并使用 JWT 我已经
  • 在独立运行的 Powershell 脚本之间传递信息

    抱歉之前是工资 我会再尝试 情况很复杂 无法解释 但基本上问题是 如何将字符串 最多 20 个字符 从一个脚本传递到另一个脚本在同一台机器上运行 这两个脚本在后台连续运行同一台机器 在下面相同的用户上下文 but 不能合并 I 不能点源一个
  • 我想在 Excel 中从数千个项目的列表中查找特定项目的最新日期

    因此 在上面第一个项目的示例中 我希望最晚日期为 2018 年 7 月 17 日 对于 Office 365 使用 MAXIFS MAXIFS B B A A A2 对于较旧的 USE AGGREGATE AGGREGATE 14 6 B
  • SolidJS:打字稿错误表示值的类型为“未定义”,尽管检查它不是

    我有一些 SolidJS 代码 例如 value undefined img src srcs value where value是一个信号 我在下面收到 TypeScript 错误value saying Type undefined c
  • 如何在Firemonkey中绘制虚线?

    我想在 Firemonkey 项目中的 TPaintbox 画布上绘制点状网格 结果应该如下所示 首先 我想我会绘制垂直虚线 然后绘制水平虚线 因此考虑到这一点 我尝试先绘制一条线 以使外观恰到好处 这就是我尝试过的 Canvas Stro
  • newBufferWithBytes() 有大小限制吗?

    我一直在使用 Metal 渲染多面体 当我尝试使用 newBufferWithBytes 渲染一个二十面体实体时 该问题发生了 该实体的顶点仅包含 1680 字节的数据 然后整个应用程序停止 CPU 和 GPU 帧都降至零 一切都恢复正常
  • Spring Security 具有数据库和多个角色?

    我正在尝试使用 spring 3 0 制作一个应用程序 现在我决定尝试一下 spring security 和 hibernate 我已经看到可以用数据库支持它 并且我已经看到了定义您自己的查询的参考 现在我遇到的问题是我找到的教程不太清楚
  • 如何高效存储100万个单词并通过starts_with、contains或ends_with进行查询?

    网站如何喜欢this https www morewords com contains c存储数万个 包含 c 的单词 或者类似this https word tips words with d and c 带有 d 和 c 的单词 或者更
  • 如何判断两个日期是否在同一天或同一小时? [复制]

    这个问题在这里已经有答案了 JavaScript Date 对象将日期与时间进行比较 因此 如果比较 time1 getTime time2 getTime 他们将是 false 如果至少有一毫秒不同 我们需要的是有一个很好的方法来按小时
  • 在 Google 脚本中尝试/捕获 HTTP 响应的最佳方法

    我对 JavaScript 和 Google apps 脚本还很陌生 这是我第一次尝试使用 Try Catch 语句 我正在运行连接到页面的脚本 它在大多数情况下都可以毫无问题地连接 但有时它不会响应并抛出 http 错误 或者 响应将为空
  • HtmlUnitDriver 无法正确获取页面

    我是这方面的新手 基本上我正在尝试使用 HtmlUnitDriver 这是我的代码 WebDriver driver new HtmlUnitDriver driver get http www google com System out
  • 如何通过单击按钮打开新窗口

    作为我的程序的一部分 我需要一个按钮 当用户单击它时 它会打开一个新窗口 好吧 我想我应该有一个类来制作框架并通过按钮调用它 但我没有任何开始的想法 我刚刚在程序中找到了按钮 但它不起作用 那么有人可以告诉我该怎么做吗 或编码 这是您想要执
  • 更改 Azure Devops 中的组织 URL 时对管道代理的影响

    我想在 Azure Devops 中重命名我的组织 URL 这 articles https support microsoft com en gb help 2793597 things to do before and after yo
  • 使用 Office 2010 COM 的 asp.net Web 服务

    我正在编写一个 Web 服务 并希望将 docx 或 doc 更改为 xps 我正在使用 Office com 来帮助我另存为 xps 格式 如下所示 WebMethod public string GetDocPreviewUrl str
  • Java编译器/解释器

    为什么我们说Java是一种编译型和解释型语言 这样做的好处是什么 被编译和解释 Java 在编译时被编译为中间 字节代码 这与 C 等语言在编译时编译为机器语言形成对比 Java 字节代码不能像编译的 C 代码那样直接在硬件上执行 相反 字
  • 在 eclipse 中调试 Android 返回堆栈

    有没有办法在 Eclipse ADT IDE 中可视化 Android 中的后台堆栈以及活动和片段 您的意思是只是为了调试目的看看它是什么样子吗 在这种情况下 定义 public static void displayBackStack F
  • 如何使用自定义 JTable 单元格编辑器和单元格渲染器

    我创建了一个带有自定义表格渲染和自定义单元格编辑器的 JTable 它给出了图像中的结果 我使用扩展 JPanel 的单独类创建了第一个表格单元格中显示的面板 并将表值添加为 tbl setCellEditor new customCell