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
单元格的默认装饰。通过查看代码,它看起来很不错。但我对结果不太满意。默认的桌子(在底部)感觉更平滑:看起来非常完美。谢谢