无法使用自定义渲染器

Unable to use custom renderer

我正在尝试为 jTable 创建自定义单元格渲染器。我承认,即使阅读了这么多书,我仍然无法真正理解如何将自定义组件添加为单元格渲染器。我想添加 JCheckBox 渲染器。

到目前为止我已经尝试过这段代码:

import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class test extends JFrame {
    public static DefaultTableModel model = new DefaultTableModel();
    public static void main (String args[]){
    JTable table = new JTable();
    table.setDefaultRenderer(String.class, new CheckboxTableCellRenderer());
    table.setModel(model);
    model.addRow(new Object[] {"testData2","testData1"});
    JFrame frame = new JFrame();
    frame.add(list);
    frame.pack();
    frame.setVisible(true);
}



public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
 TableCellRenderer {

@Override
public Component getTableCellRendererComponent( JTable table,
        Object value, boolean isSelected, boolean hasFocus,
        int row, int column ){
     setComponentOrientation(table.getComponentOrientation());

     setFont(table.getFont());
     setText(String.valueOf(value));

     setBackground(table.getBackground());
     setForeground(table.getForeground());

     setSelected(isSelected);
     setEnabled(table.isEnabled());

     return this;
}

}
}

但是无论我尝试向模型添加哪一行,它都不会在 table 中显示任何数据。

任何人都可以告诉我正确的方法吗?

工作示例:

import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class test extends JFrame {
    public static DefaultTableModel model = new DefaultTableModel(0, 4) {
      public Class getColumnClass(int columnIndex) {
        if (columnIndex == 2 || columnIndex == 3) {
          return Boolean.class;
        } else {
          return Object.class;
        }
      }
    };
    public static void main (String args[]){
      JTable table = new JTable();
      table.setDefaultRenderer(Boolean.class, new CheckboxTableCellRenderer());
      model.addRow(new Object[] {"testData2","testData1",false,true});
      table.setModel(model);
      JFrame frame = new JFrame();
      frame.add(new JScrollPane(table));
      frame.setSize(640,480);
      frame.setVisible(true);
    }

    public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
     TableCellRenderer {

      @Override
      public Component getTableCellRendererComponent( JTable table,
              Object value, boolean isSelected, boolean hasFocus,
              int row, int column ){
           setComponentOrientation(table.getComponentOrientation());

           setFont(table.getFont());

            if (!isSelected) {
              setBackground(table.getBackground());
              setForeground(table.getForeground());
            } else {
              setBackground(table.getSelectionBackground());
              setForeground(table.getSelectionForeground());
            }


           setSelected((Boolean) value);
           setEnabled(table.isEnabled());

           return this;
      }

    }

}

您只需要 Boolean.class 的自定义渲染器,但 DefaultTableModel 只需要 returns Object.class,因此覆盖 getColumnClass。可能还需要指定列数,请参阅构造函数调用。

isSelected 与单元格中的值无关,而是与是否选择了 cell/row 并且应该以相反(或其他)颜色显示有关。

还添加了一个JScrollPane,可能不需要。

编辑看起来仍然很奇怪,您可能还需要定义一个自定义编辑器,但不确定。

编辑:如果按照@trashgod 的建议,我们只是放弃 setDefaultRenderer() 调用,它看起来很不错。