1

我有一个包含 3 列的表,第一列是特殊的,包含一个复选框而不是标题。

问题是复选框标题的布局(外观)与其他标题不同。任何人都可以帮忙吗?

编码:

import java.awt.*;  
import javax.swing.*;  
import javax.swing.table.*;  
import java.awt.event.*; 

public class JTableHeaderCheckBox  
{  
  Object colNames[] = {"", "String", "String"};  
  Object[][] data = {};  
  DefaultTableModel dtm;  
  JTable table;  
  public void buildGUI()  
  {  
    dtm = new DefaultTableModel(data,colNames);  
    table = new JTable(dtm);  
    for(int x = 0; x < 2; x++)  
    {  
      dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2","Row "+(x+1)+" Col 3"});  
    }  
    JScrollPane sp = new JScrollPane(table);  
    TableColumn tc = table.getColumnModel().getColumn(0);  
    tc.setCellEditor(table.getDefaultEditor(Boolean.class));  
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));  
    tc.setHeaderRenderer(new CheckBoxHeader());  
    JFrame f = new JFrame();  
    f.getContentPane().add(sp);  
    f.pack();  
    f.setLocationRelativeTo(null);  
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    f.setVisible(true);  
  }  

  public static void main (String[] args)  
  {  
    SwingUtilities.invokeLater(new Runnable(){  
      public void run(){  
        new JTableHeaderCheckBox().buildGUI();  
      }  
    });  
  }  
}  

class CheckBoxHeader extends JCheckBox implements TableCellRenderer {  
    protected CheckBoxHeader rendererComponent;  
    protected int column;  

    public CheckBoxHeader() {  
        rendererComponent = this;   
    }  

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {  
        setColumn(column);   
        return rendererComponent;  
    }  

    protected void setColumn(int column) {  
        this.column = column;  
    }  
    public int getColumn() {  
        return column;  
    }    
} 

奇怪的输出:

在此处输入图像描述

更新:
我想要什么:

  1. 居中对齐标题中的复选框
  2. 如果您密切注意,您会注意到复选框 Header 的背景(似乎弹出到内部)与其他 2 个标题不同(它们似乎弹出
4

2 回答 2

4

如果您指的是复选框的边框,您可以尝试这样做以使标题看起来更加一致:

public CheckBoxHeader() {  
    rendererComponent = this;  

    setHorizontalAlignment(JLabel.CENTER);
    setBorderPaintedFlat(true);
    setBorderPainted(true);
}  
于 2012-01-31T19:04:48.433 回答
3

TableCellRenderer返回JLabel/JComponents并且这些JComponents 还没有实现任何 LayoutManager,但是对于设置一些没有任何限制LayoutManagers

于 2012-01-31T18:46:51.647 回答