【问题标题】:Editable JTable Tutorial可编辑的 JTable 教程
【发布时间】:2008-09-17 16:29:39
【问题描述】:

有没有好书或网站可以创建JTable?我想让一列可编辑。我实际上想将继承的 JCheckBox 组件(我们在此处创建)放入其中一个表列中,而不是仅仅将表放入 JCheckBox 中,因为它是可编辑的 boolean 字段。

我有 JFC Swing Tutorial Second Edition 的书,但我只是想知道是否有其他示例可以查看并学习如何更好地处理表格。这本书似乎只是把java'trail'放到了网上。

不过,我正在重新阅读这些东西,只是想知道是否有人发现了一些可能会有所帮助的东西。

【问题讨论】:

  • 请重新表述问题,以免听起来离题(“要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题是离题的” Stack Overflow 的主题,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。")。

标签: java swing jtable


【解决方案1】:

要使列可编辑,您必须覆盖TableModel 中的isCellEditable 方法。如果您继承 AbstractTableModel,则创建 TableModel 相当容易,除了最简单的 JTables 之外,我建议所有人使用它。

但是,调整TableModel 只是您需要做的一部分。要真正在JTable 中获取自定义组件,您需要设置自定义单元格渲染器。要使用交互式自定义组件,您需要设置自定义单元格编辑器。在某些情况下,为此使用默认类的略微修改版本就足够了。

编辑器

如果您已经有了自定义组件,使用委托可以轻松完成:创建一个实现TableCellEditor 的新类,并在getCellEditorComponent 方法中返回组件的 实例。此方法的参数包括当前值以及单元格坐标、返回表格的链接以及是否选择了单元格。

TableCellEditor 还有一个方法,当用户提交对单元格内容的更改(您可以在其中验证用户输入和调整模型)或取消编辑时调用该方法。如果您曾经以编程方式中止编辑,请务必在您的编辑器上调用stopEditing() 方法,否则编辑器组件将保留在屏幕上——这曾经花了我大约 2 个小时来调试。

请注意,在JTable 编辑器和 编辑器接收事件!可以使用渲染器来显示按钮。但是要获得一个正常工作的按钮,您需要实现一个编辑器并注册了正确的EventListeners。在渲染器上注册监听器没有任何作用。

渲染器

对于您在问题中描述的内容,实施渲染器并不是绝对必要的,但您通常最终还是会这样做,即使只是为了进行微小的修改。与编辑器不同,渲染器对速度至关重要。 渲染器的getTableCellRendererComponent为表格中的每个单元格调用一次!渲染器返回的组件仅用于绘制单元格,不用于交互,因此可以“重用”下一个单元格。换句话说,您应该在渲染器中调整组件(例如,使用setText(...)setFont(...),如果它是TextComponent),您应该实例化一个新组件——这很容易削弱性能的方法。

注意事项

请注意,要使渲染器和编辑器正常工作,您需要告诉JTable 何时使用某个渲染器/编辑器。基本上有两种方法可以做到这一点。您可以使用相应的JTable 方法为特定类型设置默认单元格渲染器/编辑器。要使这种方式起作用,您的 TableModel 需要在 getColumnClass(...) 方法中准确返回此类型!默认表模型不会为您执行此操作,它始终返回 Object.class。我敢肯定,它难倒了很多人。

设置编辑器/渲染器的另一种方法是在列本身上显式设置它,即通过JTablegetTableColumn(...) 方法获取TableColumn。这要复杂得多,但是,它也是为单个类拥有两个不同的渲染器/编辑器的唯一方法。例如。您的模型可能有两列 String 类,它们以完全不同的方式呈现,可能一次使用 JLabel/DefaultRenderer,另一列使用 JButton 来访问更精细的编辑器。

JTable 及其自定义渲染器和编辑器非常 用途广泛,但它也有很多需要考虑的地方,还有很多事情要做错。祝你好运!

The Swing Tutorial 中的How to Use Tables 是任何自定义 JTables 的必读内容。特别是,阅读和重新阅读Concepts: Editors and Renderers,因为它通常需要一段时间才能“点击”。自定义渲染器和编辑器的例子也很值得。

【讨论】:

    【解决方案2】:

    您想要研究扩展以创建自己的行为的类是 DefaultTableModel。这将允许您定义自己的行为。一个不错的教程可以找到on sun's site

    【讨论】:

    • 是的,这就是我目前正在寻找的线索 :) 我们之前在这里扩展了 AbstractTableModel 并且我知道我必须覆盖 getColumnClass 和 isCellEditable 等等,我只是无法处理所有这些在可编辑单元格上:(
    【解决方案3】:

    来自java lobby 的本教程很容易上手。您引用的在线Swing trail for JTable 表示已更新。您是否浏览了整个信息以获得可能更好(不是更新总是更好)的信息?

    【讨论】:

      【解决方案4】:

      如果您尝试使用带有 1 列可编辑的简单 JTable 并且您知道列位置,您可以始终使用默认表模型并重载 isCellEditable 调用。

      类似这样的:

      myTable.setModel(new DefaultTableModel(){
      @Override
      public boolean isCellEditable(int row, int column) {
          if (column == x) {
              return true;
          } else
              return false;
      }
      });
      

      为复选框创建一个渲染器类

      MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
      

      【讨论】:

        【解决方案5】:

        一些有用的类是:

        Package javax.swing.table

        TableModel - tablemodel 的接口 AbstractTableModel - 很好的类,可以扩展以使用自定义数据结构创建您自己的表 DefaultTableModel - 可以处理arrays[]Vectors的默认表模型

        要禁用对任何单元格的编辑,您需要覆盖 isCellEditable(int row, int col) 方法

        【讨论】:

          【解决方案6】:

          在您的表格模型中,您应该重写“isCellEditable”和“setValueAt”函数,如下所示。
          第 4 列是可编辑单元格的列。
          然后,当您双击单元格并输入内容时,
          将调用 setValueAt() 并将值保存到 tableModel 的 DO,字段 col4。

          public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table
          
          @Override
          public boolean isCellEditable(int row, int col) {
              if (col == 4) {
                  return true;
              } else {
                  return false;
              }
          }
          
          @Override
          public void setValueAt(Object value, int row, int col) {
              if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
                  if (col == 4) {
                      tbmData.get(row).col4= (String) value;
                  }
                  fireTableCellUpdated(row, col);
              } else {
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-14
            • 2013-08-10
            • 2015-03-17
            • 2010-12-31
            • 2014-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多