gpt4 book ai didi

java - Jtable cellRenderer 更改行的背景

转载 作者:行者123 更新时间:2023-12-01 23:53:58 24 4
gpt4 key购买 nike

我已经尝试了一段时间并在互联网上寻找解决方案,但我失败了。我想做的是动态更改 Jtable 的行背景。我创建了 arrayList,它保留所选行的数量(每次用户按 alt+单击单元格时添加它们)并在我自己的 tableCellRenderer 中添加了

for(Integer c: leftSelectedCells){
if(c.equals(row)){comp.setForeground(Color.red); }
else { comp.setForeground(Color.black);}
}

它正在工作,对于少数单元格,或者一段时间后选定的列恢复到原始颜色,我已经检查过,整数仍然在数组中,所以这不是问题,知道什么可能导致问题吗?

最佳答案

正如上面评论中已经建议的,您需要为所有必需的列提供自定义呈现器。作为替代方案,您可以重写 JTable.prepareRenderer 以根据受影响的行列表设置背景。 Table Row Rendering @camickr 解释了这种方法。下面是突出显示使用鼠标 + Alt 键单击的行的示例。为简单起见,突出显示的行的列表保留为客户端属性。

import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableHighlight {
TableHighlight() {
JFrame frame = new JFrame("TableHighlight");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Object[][] data = { { "Column 1", "Column 2" },
{ "Column 1", "Column 2" }, { "Column 1", "Column 2" },
{ "Column 1", "Column 2" } };

Object[] columnNames = { "Column 1", "Column 2" };

DefaultTableModel model = new DefaultTableModel(data, columnNames);

final JTable table = new JTable(model) {
@Override
public Component prepareRenderer(TableCellRenderer renderer,
int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
List<Integer> selectedRows = (List<Integer>) getClientProperty("highlightRows");
c.setBackground(selectedRows.contains(row) ? Color.cyan : getBackground());
return c;
}
};

table.putClientProperty("highlightRows", new ArrayList<Integer>());

table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
if (!evt.isAltDown())
return;
int row = table.rowAtPoint(evt.getPoint());
if (row == -1)
return;
List<Integer> selectedRows = (List<Integer>) table
.getClientProperty("highlightRows");
int index = selectedRows.indexOf(row);
if (index != -1)
selectedRows.remove(index);
else
selectedRows.add(row);
table.repaint();
}
});

frame.add(new JScrollPane(table));
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}

public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TableHighlight();
}
});
}
}

关于java - Jtable cellRenderer 更改行的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15888434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com