在JTable中显示组件的最佳方法?

Sup*_*tar 4 java performance swing jtable jcomponent

我不是要问如何在JTable中显示一个Component,因为在线有几个教程和示例.但是,我想知道最好的解决方法是什么.

举例来说,我碰到最教程有创建单独的类(主类,一个扩展的例子JTable,在延伸TableModel,一个扩展TableCellRenderer,等等).但是,我发现你不仅可以在一个类中完成它,而且可以通过简单地使用以下方法来实现:

示例代码(SSCCE)


主要

public class Main
{
  public static void main(String[] args)
  {
    javax.swing.JFrame jf = new javax.swing.JFrame("A table with components");
    jf.setLayout(new java.awt.BorderLayout());
    jf.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    jf.add(new TableWithCompsPanel(), java.awt.BorderLayout.CENTER);
    jf.setVisible(true);
  }
}
Run Code Online (Sandbox Code Playgroud)

TableWithComps

public class TableWithCompsPanel extends java.awt.Container
{
  private Class<?> tableColumnClassArray[];
  private javax.swing.JTable jTableWithComps;
  private Object tableContentsArray[][];

  public TableWithCompsPanel()
  {
    tableContentsArray = new Object[][]
      {
        {"This is plain text",                                            new javax.swing.JButton("This is a button")    },
        {new javax.swing.JLabel("This is an improperly rendered label!"), new javax.swing.JCheckBox("This is a checkbox")}
      };
    tableColumnClassArray = new Class<?>[]{String.class, java.awt.Component.class};
    initGUI();
  }

  private void initGUI()
  {
    setLayout(new java.awt.BorderLayout());
    jTableWithComps = new javax.swing.JTable(new javax.swing.table.AbstractTableModel()
      {
        @Override public int getRowCount()
        {
          return tableContentsArray.length;
        }

        @Override public int getColumnCount()
        {
          return tableContentsArray[0].length;
        }

        @Override public Object getValueAt(int rowIndex, int columnIndex)
        {
          return tableContentsArray[rowIndex][columnIndex];
        }

        @Override public Class<?> getColumnClass(int columnIndex)
        {
          return tableColumnClassArray[columnIndex];
        }
      });
    jTableWithComps.setDefaultRenderer(java.awt.Component.class, new javax.swing.table.TableCellRenderer()
    {
      @Override public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
      {
        return value instanceof java.awt.Component ? (java.awt.Component)value : new javax.swing.table.DefaultTableCellRenderer();
      }
    });
    add(jTableWithComps, java.awt.BorderLayout.CENTER);
  }
}
Run Code Online (Sandbox Code Playgroud)


我想知道的是,如果能够在如此短的代码中完成,为什么示例会将它们分成三个,有时甚至更多的类?我的代码在运行时是否效率较低?我可以理解分离主类和具有示例GUI的类,但不是为什么要将示例GUI分成几个类.

编辑:我看到很多人给出了很好的理由,为什么这段代码是不切实际的.如果您提供替代方案,我将非常感谢您的回答!

Kev*_*n K 5

TableModel模型的数据要跟踪可能的最简单的方法,对于内存的效率着想.的TableCellRenderer定义如何显示在一个表格单元格的数据.

在iTunes复选框示例中,从复选框中建模信息的最简单方法是布尔值(true/false).存储10,000个boolean对象的集合比10,000个JCheckBox对象的内存效率高得多.

然后TableCellRenderer可以存储单个JCheckBox对象,当要求用于绘制单元格的组件时,它可以根据值检查/取消选中复选框,并且每次都返回相同的组件.这样,当用户滚动表格时,您不会反复创建数千个UI组件.