学习自

基础表格

JTable用来编辑二维表格。注意添加到容器时表头和内容要分开添加。表头获取是table.getTableHeader()。

构造方法:

  • JTable(int numRows, int numColumns)
  • JTable(Object[][] rowData, Object[] columnNames):columnnames是表头名称
  • JTable(TableModel dm): 用表格模型创建表格

方法:

setFont(Font f)

//被选中字体颜色
setSelectionForeground(Color selectionForeground)

setForeground(Color fg)//字体颜色

setSelectionBackground(Color selectionBackground)

//网格颜色
setGridColor(Color gridColor)

//是否显示网格
setShowGrid(boolean showGrid)


//水平网格是否显示
setShowHorizontalLines(boolean showHorizontalLines)

setShowVerticalLines(boolean showVerticalLines)
  • JTableHeader getTableHeader(): 获取表头
  • jTableHeader.setFont(Font font);: 设置表头颜色
  • jTableHeader.setForeground(Color fg)
  • jTableHeader.setResizingAllowed(boolean resizingAllowed):时候可以拖动调整列大小
  • jTableHeader.setReorderingAllowed(boolean reorderingAllowed): 是否可以拖动进行重新排序
  • setRowHeight(int rowHeight): 行高
  • setRowHeight(int row, int rowHeight): 指定行行高
  • setAutoResizeMode(int mode)改变列宽的操作
    • JTable.AUTO_RESIZE_ALL_COLUMNS 在所有的调整大小操作中,按比例调整所有的列。
    • JTable.AUTO_RESIZE_LAST_COLUMN 在所有的调整大小操作中,只对最后一列进行调整。
    • JTable.AUTO_RESIZE_NEXT_COLUMN 在 UI 中调整了一个列时,对其下一列进行相反方向的调整。
    • JTable.AUTO_RESIZE_OFF 不自动调整列的宽度;使用滚动条
    • JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS 在 UI 调整中,更改后续列以保持总宽度不变;此为默认行为。
  • TableColumn jTable.getColumnModel().getColumn(int columnIndex):获取某列进行操作
  • tableColumn.setWidth(int width);
  • tableColumn.setPreferredWidth(int preferredWidth);
  • tableColumn.setMinWidth(int minWidth);
  • tableColumn.setMaxWidth(int maxWidth);
  • tableColumn.sizeWidthToFit(): 设置列宽使其符合单元格宽度
  • tableColumn.setResizable(boolean isResizable): 是否允许手动改变列宽
  • tableColumn.setHeaderValue(Object headerValue): 设置该列表头名称
  • jTable.getModel().setValueAt(Object aValue, int rowIndex, int columnIndex): 设置某个位置数据
  • Object jTable.getModel().getValueAt(int rowIndex, int columnIndex):得到某个位置数据

表格模型

TableModel中储存了表格的一系列信息,实际上导入JTable中的数据自动变成TableModel。

TableModel中的方法:

  • getRowCount(): 获取行数
  • getColumnCount(): 获取列数
  • String getColumnName(int columnIndex):获取指定列的表头名称
  • Class<?> getColumnClass(int columnIndex): 获取列中所有数据
  • isCellEditable(int rowIndex, int columnIndex):单元格是否可编辑
  • Object getValueAt(int rowIndex, int columnIndex): 获取单元格
  • setValueAt(Object aValue, int rowIndex, int columnIndex): 获取单元格值

监听器:

  • tableModel.addTableModelListener(TableModelListener l): 添加表格模型监听,表格的数据维护,对数据的监听。
  • tableModel.removeTableModelListener(TableModelListener l):去除表格模型监听

ListSelectionModel 表格选择器

它可以让用户以不同模式选中表格。

  • table.setCellSelectionEnabled(boolean cellSelectionEnabled):设置表格可以被选择
  • table.getSelectionModel(): 获得选择器
  • selectionModel.setSelectionMode(int selectionMode):设置选择模式
    • ListSelectionModel.MULTIPLE_INTERVAL_SELECTION 一次选择一个或多个连续的索引范围(默认)
    • ListSelectionModel.SINGLE_INTERVAL_SELECTION 一次选择一个连续的索引范围
    • ListSelectionModel.SINGLE_SELECTION 一次只能选择一个列表索引

监听器:

addListSelectionListener: 在选中状态改变时调用

TableCellRenderer 单元格的渲染器

可以自己创建一个表格渲染器。然后TableColumn有setCellRenderer(renderer)。

public static class MyTableCellRenderer extends DefaultTableCellRenderer {
/**
* 返回默认的表单元格渲染器,此方法在父类中已实现,直接调用父类方法返回,在返回前做相关参数的设置即可
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// 偶数行背景设置为白色,奇数行背景设置为灰色
if (row % 2 == 0) {
setBackground(Color.WHITE);
} else {
setBackground(Color.LIGHT_GRAY);
}

// 第一列的内容水平居中对齐,最后一列的内容水平右对齐,其他列的内容水平左对齐
if (column == 0) {
setHorizontalAlignment(SwingConstants.CENTER);
} else if (column == (table.getColumnCount() - 1)) {
setHorizontalAlignment(SwingConstants.RIGHT);
} else {
setHorizontalAlignment(SwingConstants.LEFT);
}

// 设置提示文本,当鼠标移动到当前(row, column)所在单元格时显示的提示文本
setToolTipText("提示的内容: " + row + ", " + column);

// PS: 多个单元格使用同一渲染器时,需要自定义的属性,必须每次都设置,否则将自动沿用上一次的设置。

/*
* 单元格渲染器为表格单元格提供具体的显示,实现了单元格渲染器的 DefaultTableCellRenderer 继承自
* 一个标准的组件类 JLabel,因此 JLabel 中相应的 API 在该渲染器实现类中都可以使用。
*
* super.getTableCellRendererComponent(...) 返回的实际上是当前对象(this),即 JLabel 实例,
* 也就是以 JLabel 的形式显示单元格。
*
* 如果需要自定义单元格的显示形式(比如显示成按钮、复选框、内嵌表格等),可以在此自己创建一个标准组件
* 实例返回。
*/

// 调用父类的该方法完成渲染器的其他设置
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}

TableCellEditor 数据编辑器

数据编辑器可以在表格中加入textfield,JComboBox等组件。实际一般使用默认的实现类DefaultCellEditor

tableColumn.setCellEditor(cellEditor)设置表格编辑器

public static class MyCellEditor extends DefaultCellEditor {

public MyCellEditor(JTextField textField) {
super(textField);
}

public MyCellEditor(JCheckBox checkBox) {
super(checkBox);
}

public MyCellEditor(JComboBox comboBox) {
super(comboBox);
}

@Override
public boolean stopCellEditing() {
// 获取当前单元格的编辑器组件
Component comp = getComponent();

// 获取当前单元格编辑器输入的值
Object obj = getCellEditorValue();

// 如果当前单元格编辑器输入的值不是数字,则返回 false(表示数据非法,不允许设置,无法保存)
if (obj == null || !obj.toString().matches("[0-9]*")) {
// 数据非法时,设置编辑器组件内的内容颜色为红色
comp.setForeground(Color.RED);
return false;
}

// 数据合法时,设置编辑器组件内的内容颜色为黑色
comp.setForeground(Color.BLACK);

// 合法数据交给父类处理
return super.stopCellEditing();
}
}

RowSorter 排序器

创建: RowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(tableModel)

TableRowSroter是RowSorter的实现类。

使用 table.setRowSorter(rowSorter)