如何在Java中实现JTable的自动换行表头(JTableHeader)?
JTableHeader
- JTableHeader 是 JComponent 类的子类。
- 当我们创建一个 JTable 对象时,构造函数会创建一个新的 JTableHeader 对象来管理表格组件的表头。
- JTableHeader 对象与表格组件的 列模型 关联,以便其 UI委托 可以拖动列并渲染每一列的表头单元格。
- JTable 提供了一个 setTableHeader() 方法,用于设置表格表头组件的 JTableHeader 对象,以及一个 getTableHeader() 方法,用于返回对表格表头组件的 JTableHeader 对象 的引用。
我们可以通过自定义 DefaultTableModel 类或 AbstractTableModel 类来实现JTable的 自动换行表头 。
示例
import java.util.*; import javax.swing.*; import javax.swing.table.*; public class WordWrappingTableHeaderTest extends JFrame { private JTable table; public WordWrappingTableHeaderTest() { setTitle("WordWrappingTableHeader Test"); DefaultTableColumnModel tableColumnModel = new DefaultTableColumnModel() { public void addColumn(TableColumn column) { column.setHeaderRenderer(new JTableHeader().getDefaultRenderer()); super.addColumn(column); } }; table = new JTable(); table.setFillsViewportHeight(true); table.setColumnModel(tableColumnModel); table.setModel(new DemoTableModel(Arrays.asList("Word Wrapping TableHeader Test", "Word Wrapping TableHeader Test", "Word Wrapping TableHeader Test"), 20)); add(new JScrollPane(table)); setSize(450, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null); setVisible(true); } class DemoTableModel extends AbstractTableModel { private ArrayList wrappedColumnNames = new ArrayList(); private int numRows; DemoTableModel(List columnNames, int numRows) { for (String name: columnNames) wrappedColumnNames.add("" + name + ""); this.numRows = numRows; } public int getRowCount() { return numRows; } public int getColumnCount() { return wrappedColumnNames.size(); } public Object getValueAt(int rowIndex, int columnIndex) { return Integer.valueOf(10000 + (rowIndex + 1)*(columnIndex + 1)); } public String getColumnName(int column) { return wrappedColumnNames.get(column); } public Class getColumnClass(int columnIndex) { return Integer.class; } } public static void main(String[] args) { new WordWrappingTableHeaderTest(); } }
输出
广告