所以说我们有一个31列10行的JTable。 我想将2列4行的颜色更改为红色。 在我这样做之后,改变另一种细胞颜色,而不会失去我之前细胞的颜色。
我尝试了以下但没有成功:
public class CellR extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setForeground(Color.white);
if(row == TestHotel.v.getRow() && column == TestHotel.v.getCol()){
// Only for specific cell
// c.setFont(/* special font*/);
// you may want to address isSelected here too
setForeground(Color.BLACK);
setBackground(Color.RED);
}
return this;
}
如果我第一次调用渲染器工作......但如果我想改变另一种颜色,我就会失去第一种颜色。
答案 0 :(得分:2)
表和列表中的单元格渲染器用作"戳"。 一个组件用于绘制所有单元格。另请参阅Concepts: Editors and Renderers。如果您想保留有关"突出显示的信息"细胞,你不得不存储它们。
一个例子(基于评论扩展):
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class CellRendererTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] columnNames = {
"First Name", "Last Name", "Sport" };
Object[][] data = {
{"Kathy", "Smith", "Snowboarding" },
{"John", "Doe", "Rowing" },
{"Sue", "Black", "Knitting"},
{"Jane", "White", "Speed reading"},
{"Joe", "Brown", "Pool"}
};
final JTable table = new JTable(data, columnNames);
final ColoringCellRenderer cellRenderer = new ColoringCellRenderer();
TableColumnModel columnModel = table.getColumnModel();
int cc = columnModel.getColumnCount();
for (int c=0; c<cc; c++)
{
TableColumn column = columnModel.getColumn(c);
column.setCellRenderer(cellRenderer);
}
JScrollPane scrollPane = new JScrollPane(table);
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(scrollPane, BorderLayout.CENTER);
JButton addRandomColorButton = new JButton("Add random color");
addRandomColorButton.addActionListener(new ActionListener()
{
private Random random = new Random(0);
@Override
public void actionPerformed(ActionEvent e)
{
int rows = table.getRowCount();
int cols = table.getColumnCount();
int row = random.nextInt(rows);
int col = random.nextInt(cols);
int r = random.nextInt(255);
int g = random.nextInt(255);
int b = random.nextInt(255);
cellRenderer.setCellColor(row, col, new Color(r,g,b));
table.repaint();
}
});
f.getContentPane().add(addRandomColorButton, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class ColoringCellRenderer extends DefaultTableCellRenderer
{
private final Map<Point, Color> cellColors = new HashMap<Point, Color>();
void setCellColor(int r, int c, Color color)
{
if (color == null)
{
cellColors.remove(new Point(r,c));
}
else
{
cellColors.put(new Point(r,c), color);
}
}
private Color getCellColor(int r, int c)
{
Color color = cellColors.get(new Point(r,c));
if (color == null)
{
return Color.WHITE;
}
return color;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
Color color = getCellColor(row, column);
setBackground(color);
return this;
}
}
编辑:剩下的部分来自原始答案,仅使用单个单元格颜色。上面的新内容更完整(功能更强大,因为它可以模拟单色渲染器),但我会在此处留下完整性
这可以通过像这样的渲染器来实现:
class ColoringCellRenderer extends DefaultTableCellRenderer
{
private final Set<Point> highlightedCells = new HashSet<Point>();
void setHighlighted(int r, int c, boolean highlighted)
{
if (highlighted)
{
highlightedCells.add(new Point(r,c));
}
else
{
highlightedCells.remove(new Point(r,c));
}
}
private boolean isHighlighted(int r, int c)
{
return highlightedCells.contains(new Point(r,c));
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
if (isHighlighted(row, column))
{
setForeground(Color.BLACK);
setBackground(Color.RED);
}
else
{
setForeground(Color.BLACK);
setBackground(Color.WHITE);
}
return this;
}
}
然后,您可以创建此渲染器的实例,并添加或删除要突出显示的单元格:
ColoringCellRenderer r = new ColoringCellRenderer();
// Assign renderer to table...
...
// Later, highlight cells:
r.setHighlighted(4,2,true);
r.setHighlighted(6,1,true);
r.setHighlighted(1,5,false);
...
如果您想要单元格的不同的颜色,则可以将Set
替换为映射特定Map
的{{1}}(表示行/列) (单元格)到Point
对象。
答案 1 :(得分:0)
您需要在要打开的列上设置单元格渲染器。
如果您希望第2行第4列的单元格颜色为红色,则应在第4列设置渲染器。您甚至可以在所有列上设置渲染器。
然后你所要做的就是对行进行if-check。即。 if(row == 4)。但我认为你会从你的 TestHotel.v 对象获得你的价值。