【问题标题】:How do I modify a TableCellRenderer without losing the default rendering?如何在不丢失默认渲染的情况下修改 TableCellRenderer?
【发布时间】:2016-07-22 07:20:32
【问题描述】:

我有一个有四列的 JTable。我正在尝试将其中一列的标题居中对齐。我得到了一个半有效的解决方案,但问题是标题的默认渲染/样式似乎丢失了。见截图。我想获取当前的 TableCellRenderer,将标题对齐更改为 CENTER,并将调整后的 TableCellRenderer 应用于特定列。我该怎么做?

表格截图

我的 JTable 类

public class MyTable extends JTable {

public MyTable() {
    String[] headers = { "Parent", "Summary", "Key", "Processed" };
    MyTableModel model = new MyTableModel(headers);

    Object[] testrow = { "TST-99999", "S", "K", false };
    model.addRow(testrow);

    setModel(model);

    Enumeration<TableColumn> columns = getColumnModel().getColumns();
    while (columns.hasMoreElements()) {
        TableColumn column = (TableColumn) columns.nextElement();
        System.out.println(column.getHeaderValue());
        column.setResizable(false);
        switch ((String) column.getHeaderValue()) {
        //case "Parent":
        //case "Key":
        case "Processed":
            column.setMaxWidth(80);
            column.setMinWidth(80);
            column.setHeaderRenderer(new CenterRenderer());
            break;
        }
    }
}
}  

我的 TableModel 类

public class MyTableModel extends DefaultTableModel {

public MyTableModel(String[] headers) {
    for(String header:headers){
        addColumn(header);
    }
}

@Override
public boolean isCellEditable(int row, int column) {
   return false;
}


@Override
public Class<?> getColumnClass(int index) {
    switch (index) {
    case 0:
        return String.class;
    case 1:
        return String.class;
    case 2:
        return String.class;
    case 3:
        return Boolean.class;
    default:
        return String.class;
    }

}

}

我的 TableCellRenderer 类

public class CenterRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    label.setHorizontalAlignment(SwingConstants.CENTER);
    return label;
}
}

【问题讨论】:

  • 请发布您如何实现您所做的事情的代码,以便这里的人们可以帮助您。
  • 默认标题文本显示在中心。
  • 相关post仅供参考。

标签: java jtable


【解决方案1】:

不扩展 DefaultTableCellRenderer,而是委托给 JTableHeader 的默认渲染器:

public class CenterRenderer implements TableCellRenderer {
    private final JTableHeader header;

    public CenterRenderer(JTableHeader header) {
        this.header = header;
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = (JLabel) header.getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        return label;
    }
}

【讨论】:

  • 感谢您的回答!这个更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多