
本教程详细介绍了如何在java swing的jtable中实现选中行的颜色永久变更。通过引入一个不可见的布尔型数据列来存储行的选中状态,并结合自定义的`tablecellrenderer`来根据该状态渲染行背景色,最后利用`mouselistener`或`listselectionlistener`动态更新状态,从而克服了jtable默认选中状态临时性的限制,实现持久化的视觉反馈。
在Java Swing应用程序开发中,JTable是一个常用的组件,用于显示和编辑表格数据。然而,JTable默认的行选中行为通常是临时的:当用户点击一行时,该行会高亮显示,但当选择另一行或表格失去焦点时,之前的选中高亮就会消失。如果需要实现点击后行颜色永久改变,例如,将一行标记为“已处理”或“已选择”并保持其颜色状态,就需要采用更高级的定制方法。
本教程将介绍一种有效且灵活的解决方案,它通过结合自定义数据模型、表格渲染器和事件监听器,来实现JTable选中行颜色的永久变更。
实现JTable行颜色永久变更的关键在于将行的“选中”状态存储在数据模型中,而不是依赖JTable组件自身的临时选中状态。具体步骤如下:
首先,我们需要一个DefaultTableModel来管理表格数据。为了实现永久颜色变更,我们会在表格的最后一列添加一个布尔值,用于表示该行是否被“选中”或“标记”。这个列在视觉上是不可见的。
立即学习“Java免费学习笔记(深入)”;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import javax.swing.JTable;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
@SuppressWarnings("serial")
class ChangeRowColorPanel extends JPanel {
// 定义列名,最后一列“Selected”用于存储选中状态
private static final String[] COLUMN_NAMES = { "One", "Two", "Three", "Selected" };
private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0);
private JTable table = new JTable(model);
public ChangeRowColorPanel() {
// ... 其他初始化代码 ...
// 填充初始数据
int max = 5;
for (int i = 0; i < max; i++) {
Object[] row = new Object[COLUMN_NAMES.length];
for (int j = 0; j < COLUMN_NAMES.length - 1; j++) {
row[j] = (int) (100 * Math.random()); // 随机数据
}
row[COLUMN_NAMES.length - 1] = false; // 初始状态为未选中
model.addRow(row);
}
setLayout(new BorderLayout());
add(new JScrollPane(table));
}
}为了不让用户看到用于存储选中状态的额外列,我们需要将其从JTable的TableColumnModel中移除。注意,这只是视觉上的隐藏,该列的数据仍然存在于TableModel中。
// 在 ChangeRowColorPanel 的构造器中添加
public ChangeRowColorPanel() {
// ... model 和 table 的初始化 ...
TableColumnModel columnModel = table.getColumnModel();
// 移除最后一列(即“Selected”列)使其不可见
columnModel.removeColumn(columnModel.getColumn(columnModel.getColumnCount() - 1));
// ... 其他初始化代码 ...
}接下来,创建一个自定义的TableCellRenderer。这个渲染器的职责是根据数据模型中特定列(即我们隐藏的“Selected”列)的值来决定行的背景颜色。
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
@SuppressWarnings("serial")
class RowColorRenderer extends DefaultTableCellRenderer {
// 定义选中行的颜色
private static final Color SELECTED_COLOR = Color.PINK; // 可以根据需求修改为其他颜色
public RowColorRenderer() {
setOpaque(true); // 确保渲染器能够绘制背景色
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// 调用父类方法获取默认的渲染组件
Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
TableModel model = table.getModel();
// 获取存储选中状态的列索引
int selectedColumn = model.getColumnCount() - 1;
// 从数据模型中获取当前行的选中状态
boolean rowIsSelectedCustom = (boolean) model.getValueAt(row, selectedColumn);
// 根据自定义选中状态设置背景颜色
Color background = rowIsSelectedCustom ? SELECTED_COLOR : null; // null 表示使用默认背景色
renderer.setBackground(background);
// 注意:这里返回的是this,因为DefaultTableCellRenderer本身就是一个Component
// 如果要返回renderer,需要确保renderer的类型是Component,并且它已经设置了背景色。
// 对于DefaultTableCellRenderer,直接返回this是常见的做法,因为父类的getTableCellRendererComponent
// 已经配置了this的属性。
return this;
}
}在ChangeRowColorPanel的构造器中,将这个自定义渲染器应用到JTable:
// 在 ChangeRowColorPanel 的构造器中添加
public ChangeRowColorPanel() {
// ... 移除列的代码 ...
// 设置自定义渲染器,对所有Object类型的单元格生效
table.setDefaultRenderer(Object.class, new RowColorRenderer());
// ... 其他初始化代码 ...
}为了让用户能够通过点击来切换行的选中状态,我们需要为JTable添加一个MouseListener。当用户点击一行时,我们获取该行的索引,然后更新数据模型中对应行的布尔值,并通知表格重新绘制。
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.table.TableModel;
class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
JTable table = (JTable) e.getSource();
TableModel model = table.getModel();
int selectedRow = table.getSelectedRow(); // 获取当前被点击的行索引
if (selectedRow != -1) { // 确保有行被选中
// 获取存储选中状态的列索引
int selectedColumnIndex = model.getColumnCount() - 1;
// 获取当前行的选中状态
boolean currentlySelected = (boolean) model.getValueAt(selectedRow, selectedColumnIndex);
// 切换选中状态
model.setValueAt(!currentlySelected, selectedRow, selectedColumnIndex);
// 刷新表格以应用新的颜色
table.repaint();
}
}
}在ChangeRowColorPanel的构造器中,将这个鼠标监听器添加到JTable:
// 在 ChangeRowColorPanel 的构造器中添加
public ChangeRowColorPanel() {
// ... 设置渲染器的代码 ...
// 添加鼠标监听器
table.addMouseListener(new MyMouse());
// ... 其他初始化代码 ...
}最后,创建一个主类来启动Swing应用程序并显示包含JTable的面板。
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class TestTableRowColor {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ChangeRowColorPanel mainPanel = new ChangeRowColorPanel();
JFrame frame = new JFrame("JTable行颜色永久变更示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel);
frame.pack(); // 根据组件的首选大小调整窗口大小
frame.setLocationRelativeTo(null); // 窗口居中显示
frame.setVisible(true);
});
}
}运行上述代码后,将显示一个包含表格的窗口。每次点击表格中的一行,该行的背景颜色就会从默认色切换到SELECTED_COLOR(例如粉色),并且这个颜色状态会永久保持,直到再次点击该行。
通过在数据模型中引入一个不可见的布尔型状态列,并结合自定义的TableCellRenderer和事件监听器,我们可以有效地实现JTable选中行的颜色永久变更。这种方法将行的显示状态与数据模型紧密关联,提供了一个健壮且可扩展的解决方案,满足了许多自定义表格显示的需求。
以上就是Java JTable 行颜色永久变更教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号