如何为字符串 class 创建 JTable 的 DefaultRenderer?

How to create a JTable's DefaultRenderer for the String class?

默认情况下,空值在 JTable 中呈现为空字符串。我希望有一个默认渲染器在渲染空值时显示“NULL”,但仅限于字符串 class。以下代码适用于对象 class,如果为特定列设置了渲染器,但如果为字符串 class 设置则失败。有什么想法可以实现吗?

import javax.swing.*;
import javax.swing.table.*;

public class RenderingNull extends JFrame {

  public RenderingNull() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(150, 150);
    setLocationRelativeTo(null);

    String headers[] = {"Fruit", "Colour"};
    Object data[][] = {
        {"Tomato", "Red"},
        {"Banana", "Yellow"},
        {"Orange", null},
        {null, "Green"}
      };

    TableModel model = new DefaultTableModel(data, headers);
    JTable table= new JTable(model);
    TableCellRenderer renderer= new NullRenderer();
//    table.setDefaultRenderer(Object.class, renderer);
//    table.getColumn("Fruit").setCellRenderer(renderer);
//    table.getColumn("Colour").setCellRenderer(renderer);
    table.setDefaultRenderer(String.class, renderer);
    JScrollPane scrollPane= new JScrollPane(table);
    add(scrollPane);
    setVisible(true);
  }


  public static void main(String args[]) {
    SwingUtilities.invokeLater(RenderingNull::new);
  }


  class NullRenderer extends DefaultTableCellRenderer {
    @Override
    public void setValue(Object value) {
      setText(value==null ? "NULL" : value.toString());
    }
  }

}

but fails if set for the String class.

默认 getColumnClass(...) 方法 JTableDefaultTableModel returns Object.class.

table 根据从此方法得到的值 return 确定渲染器(和编辑器)。

因此默认情况下您只能在列级别或 Object.class 级别提供自定义呈现(如您所见)。

如果你想对 String.class 进行特殊渲染,那么你需要将上面列出的 类 中的 getColumnClass(...) 方法重写为 return String.class.

有关简单示例,请参阅: