Java 向JTable列(Mac)添加边距

Java 向JTable列(Mac)添加边距,java,macos,swing,jtable,tablecellrenderer,Java,Macos,Swing,Jtable,Tablecellrenderer,我有一个JTable看起来像这样: 是否可以为列文本添加边距 我已尝试添加一个TableCellRenderer并添加一个EmptyBorder问题:背景色变白如下: 知道如何添加边距并保持默认背景色吗 public class JTableColumnMargin extends JFrame { public JTableColumnMargin() { Object rowData[][] = { { "Row1-Column1", "Row1-Column2

我有一个
JTable
看起来像这样:

是否可以为列文本添加边距

我已尝试添加一个
TableCellRenderer
并添加一个
EmptyBorder
问题:背景色变白如下:

知道如何添加边距并保持默认背景色吗

public class JTableColumnMargin extends JFrame {

    public JTableColumnMargin() {
        Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3" }, { "Row2-Column1", "Row2-Column2", "Row2-Column3" } };
        Object columnNames[] = { "Column One", "Column Two", "Column Three" };
        JTable table = new JTable(rowData, columnNames);

        for (int i = 0; i < table.getColumnCount(); i++) {
            table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new HeaderRenderer(table));
        }

        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane, BorderLayout.CENTER);
        this.setSize(500, 150);
        this.setVisible(true);
    }

    private static class HeaderRenderer implements TableCellRenderer {
        private DefaultTableCellRenderer renderer;

        private HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
        }

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
            Component c = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
            JLabel label = (JLabel) c;
            label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
            return label;
        }
    }

    public static void main(String[] args) {
        new JTableColumnMargin();
    }
}
公共类JTableColumnMargin扩展了JFrame{
公共页边距(){
对象rowData[][]={{“Row1-Column1”、“Row1-Column2”、“Row1-Column3”}、{“Row2-Column1”、“Row2-Column2”、“Row2-Column3”};
对象columnNames[]={“第一列”、“第二列”、“第三列”};
JTable table=新的JTable(行数据、列名称);
对于(int i=0;i
尝试使用下一个标题渲染器:

private static class HeaderRenderer extends JLabel implements TableCellRenderer {

    private HeaderRenderer() {
        setBorder(BorderFactory.createCompoundBorder(UIManager.getBorder("TableHeader.cellBorder"),BorderFactory.createEmptyBorder(0, 10, 0, 10)));
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        setText(value.toString());
        return this;
    }
}

委托给原始渲染器基本上是正确的方向,只是略有不同:

  • 使用原始和清空顺序的复合边框
  • 通过使填充边框成为UIResource,轻推原始渲染器以将边框重新设置为其原始边框
比如:

@Override
public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    JComponent comp = (JComponent) originalRenderer.getTableCellRendererComponent(table, value, 
            isSelected, hasFocus, row, column);
    Border originalBorder = comp.getBorder();
    comp.setBorder(new CompoundBorderUIResource(originalBorder, 
            BorderFactory.createEmptyBorder(0, 20, 0, 0)));
    return comp;
}

不过,这很脆弱,因为LAFs可能会忽略您的设置:这一技巧对WinLAF很有效,但对Nimbus完全无效-因此不知道在Mac上的结果。

谢谢,但我想在文本中添加一个边距,而不是将列文本居中。而且似乎将边框设置为UIManager.getBorder(“TableHeader.cellBorder”)会将自定义背景更改为新背景…我已经更改了代码
UIManager.getBorder(“TableHeader.cellBorder”)
返回
JTableHeader
单元格的默认装饰。通过查看代码,它看起来很不错。但我对结果不太满意。默认的桌子(在底部)感觉更平滑:看起来非常完美。谢谢