一、跳转到指定行(确切地说,指定单元格)
1、百度一下“JTable跳转到指定行”
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class JTableNavigationExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JTable Navigation Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个JTable
JTable table = new JTable(new DefaultTableModel(new Object[]{"Column1", "Column2"}, 0));
// 添加数据
for (int i = 0; i < 10; i++) {
table.getModel().addRow(new Object[]{i, "Row " + i});
}
// 跳转到指定行
goToRow(table, 5); // 跳转到第6行(索引从0开始)
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
private static void goToRow(JTable table, int rowIndex) {
if (rowIndex >= 0 && rowIndex < table.getRowCount()) {
// 改变选择到指定行
table.changeSelection(rowIndex, 0, false, false);
// 滚动到指定行
table.scrollRectToVisible(table.getCellRect(rowIndex, 0, true));
}
}
}
在这个例子中,goToRow
方法会将JTable的选择改变到指定的行,并且滚动到该行的可视区域。注意,changeSelection
方法的第三个和第四个参数分别表示是否是通过用户交互改变选择以及是否通知监听器,通常设置为false
。
2、主要用到这行代码就行了:table.changeSelection(rowIndex, 0, false, false);
二、编辑状态时的字体样式设置
1、重写方法
import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
public class newTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private JTextField component = new JTextField();
private Font font = new Font("Arial Unicode MS", Font.PLAIN, 28);
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
component.setText((String) value);
component.setFont(font);
return component;
}
@Override
public Object getCellEditorValue() {
return component.getText();
}
}
2、调用方法 jTable.getColumnModel().getColumn(col).setCellEditor(new newTableCellEditor());
三、设置编辑时字体样式时需注意!
/** 注意:以下2行代码中,<“编辑时字体样式”代码> 应优先排布于 <“单元格设置”代码>;否之,将影响“首次编辑”时的效果。*/
// 设置编辑时的字体样式
Comp.table_home.getColumnModel().getColumn(col).setCellEditor(new newTableCellEditor());// “编辑时字体样式”代码
// 直接进入编辑状态
Comp.table_home.editCellAt(row,col);// “单元格设置”代码
注意:
这2行代码中,<“编辑时字体样式”代码> 应优先排布于 <“单元格设置”代码>;否之,将影响“首次编辑”时的效果。
四、代码更新
2024.06.05更新——
说明: 此处更新是针对本文【第(二、)大点,第(1、)小点】
我的实践过程:在JTable中,需求列的单元格的数据类型BigDecimal,而我需要改变编辑时的字体样式,因此而用到该重写方法。在昨天,我添加了一步“清空输入”的操作,就发发了“java.math.BigDecimal cannot be cast to java.lang.String”的问题,即(情况1)先“清空输入”,再去点击单元格,出现错误;(情况2)先在单元格输入数据,再切换(刷新)表格,再回到之前输入数据的单元格,出现错误。
原代码:
修改后代码:
if (value!=null){
// component.setText((String) value); // 存在java.math.BigDecimal cannot be cast to java.lang.String问题
component.setText(value.toString());// 解决了java.math.BigDecimal cannot be cast to java.lang.String问题
}else {
component.setText(null);// 清除前一次输入
}