
本教程详细介绍了如何在Java Swing的JTable中实现选中行颜色的持久化显示,而非默认的临时高亮。核心方案包括:为JTable模型添加一个隐藏的布尔列来存储行的选中状态,通过自定义TableCellRenderer根据该状态渲染行背景色,并利用MouseListener监听点击事件来切换布尔值并触发重绘,从而实现选中行颜色的永久改变。
在Java Swing应用开发中,JTable组件默认的行选择高亮是临时的,一旦失去焦点或选择其他行,高亮颜色就会消失。如果需要实现选中行颜色持久化显示,直到用户明确取消选择或重新点击,就需要采取一些定制化的策略。本教程将详细介绍如何通过结合自定义TableModel、TableCellRenderer和MouseListener来实现这一功能。
实现JTable行颜色持久化的关键在于将行的“选中”状态存储在数据模型中,并利用自定义渲染器根据该状态来绘制行的背景色。具体步骤如下:
首先,我们需要创建一个JTable及其DefaultTableModel。为了存储行的持久化选择状态,我们在TableModel中添加一个额外的列,并将其设置为布尔类型。此列在UI上是不可见的。
立即学习“Java免费学习笔记(深入)”;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.table.*;
// 主应用程序入口
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);
});
}
}
// 包含JTable的面板
@SuppressWarnings("serial")
class ChangeRowColorPanel extends JPanel {
private static final String[] COLUMN_NAMES = { "列一", "列二", "列三", "是否选中" }; // 最后一列为隐藏的选中状态列
private DefaultTableModel model = new DefaultTableModel(COLUMN_NAMES, 0);
private JTable table = new JTable(model);
public ChangeRowColorPanel() {
// 隐藏最后一列(“是否选中”列)
TableColumnModel columnModel = table.getColumnModel();
// 注意:这里移除的是模型中的最后一列,即索引为 columnModel.getColumnCount() - 1 的列
columnModel.removeColumn(columnModel.getColumn(columnModel.getColumnCount() - 1));
// 设置自定义渲染器
table.setDefaultRenderer(Object.class, new RowColorRenderer());
// 添加鼠标监听器
table.addMouseListener(new MyMouse());
// 填充示例数据
int maxRows = 5;
for (int i = 0; i < maxRows; 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; // 最后一列(选中状态)初始化为 false
model.addRow(row);
}
setLayout(new BorderLayout());
add(new JScrollPane(table));
}
}在ChangeRowColorPanel的构造函数中,我们完成了以下操作:
TableCellRenderer负责JTable中每个单元格的绘制。通过继承DefaultTableCellRenderer并重写getTableCellRendererComponent方法,我们可以根据行的选中状态来设置背景色。
@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
TableModel model = table.getModel();
// 获取隐藏的选中状态列的索引
int selectedColumn = model.getColumnCount() - 1;
// 从数据模型中获取当前行的选中状态
boolean selected = (boolean) model.getValueAt(row, selectedColumn);
// 根据选中状态设置背景色
Color background = selected ? SELECTED_COLOR : null; // 如果选中,则为SELECTED_COLOR,否则为默认背景色
renderer.setBackground(background); // 设置渲染组件的背景色
// 返回渲染器本身,因为DefaultTableCellRenderer通常就是它自己
return this;
}
}在RowColorRenderer中:
为了让用户能够交互式地切换行的持久化选中状态,我们需要为JTable添加一个MouseListener。当用户点击某一行时,我们更新数据模型中对应行的布尔值,并触发JTable的重绘。
class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
JTable table = (JTable) e.getSource(); // 获取事件源JTable
TableModel model = table.getModel(); // 获取JTable的数据模型
// 获取当前点击的行索引
int selectedRow = table.getSelectedRow();
if (selectedRow == -1) { // 如果没有选中行(例如点击了表头),则不处理
return;
}
// 获取隐藏的选中状态列的索引
int selectedColumn = model.getColumnCount() - 1;
// 获取当前行的选中状态
boolean currentlySelected = (boolean) model.getValueAt(selectedRow, selectedColumn);
// 切换选中状态并更新数据模型
model.setValueAt(!currentlySelected, selectedRow, selectedColumn);
// 强制JTable重绘,以应用新的颜色
table.repaint();
}
}在MyMouse的mousePressed方法中:
现在,所有必要的组件都已准备就绪。TestTableRowColor类负责创建主窗口并将ChangeRowColorPanel添加到其中,从而启动整个应用程序。
通过以上三个步骤,我们就成功实现了一个JTable,其中用户点击的行会永久改变颜色,直到再次点击该行取消选择。
通过上述方法,开发者可以为JTable提供更丰富的交互体验,满足特定业务需求中对行状态持久化显示的要求。
以上就是如何在Java Swing JTable中实现选中行颜色持久化的详细内容,更多请关注php中文网其它相关文章!
Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号