gpt4 book ai didi

java - 为什么在我的 JTable 的条件单元格渲染器中出现混合结果?

转载 作者:行者123 更新时间:2023-12-04 05:15:22 25 4
gpt4 key购买 nike

我一直在学习教程,学习有关 JTable 渲染器/编辑器的全部内容,但是我在尝试制作一个条件渲染器时遇到了困难,该渲染器旨在根据一组条件以不同颜色显示单元格。

这是我放在一起的 SSCCE:

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumnModel;

public class Demo2 extends javax.swing.JFrame {

public Demo2() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 300);
this.getContentPane().setLayout(new java.awt.GridLayout(1, 1));
Object[] colunas = {"Col 0"};
Object[][] dados = {{"A"},{"B"},{"C"},{"D"}};
JTable tbl = new JTable(dados,colunas);
TableColumnModel tcm = tbl.getColumnModel();
tcm.getColumn(0).setCellRenderer(new CustomCellRenderer());
JScrollPane sp = new JScrollPane(tbl);
this.add(sp);
}

class CustomCellRenderer extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
if (value.toString().equals("B")) {
c.setForeground(Color.GREEN);
c.setFont(c.getFont().deriveFont(Font.BOLD));
} else if (value.toString().equals("D")) {
c.setForeground(Color.BLUE);
c.setFont(c.getFont().deriveFont(Font.BOLD));
}
return this;
}
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Demo2().setVisible(true);
}
});
}

}

正如我所料,第二个单元格的前景为绿色且粗体,第四个单元格也是蓝色且粗体的。然而,其他单元格似乎也受到了前景色变化的影响。

enter image description here

使用断点调试,我看到它只在正确的行中执行 setForeground,尽管它同时执行了两次,这是出乎意料的。

此外,如果我将最后一个单元格从“D”更改为“DD”,那么每个单元格的前景都会变成绿色。

我想我错过了一些关于渲染器的基本知识。

最佳答案

当不需要加粗或将颜色更改回默认值时,您在哪里“取消加粗”字体?请记住,这不是自动完成的,而是您的代码需要专门执行此操作。我认为您需要有更多 else 块才能响应所有情况。

即,

    @Override
public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column);
if (value.toString().equals("B")) {
c.setForeground(Color.GREEN);
c.setFont(c.getFont().deriveFont(Font.BOLD));
} else if (value.toString().equals("D")) {
c.setForeground(Color.BLUE);
c.setFont(c.getFont().deriveFont(Font.BOLD));
} else {
c.setForeground(null);
c.setFont(c.getFont().deriveFont(Font.PLAIN));
}
return this;
}

JTable 单元格不像单个组件,而是组件的渲染图像。将它们视为用 cookies 切割机制作的。如果您更改了一个单元格的刀具并且不将其更改回来,则所有后续单元格都将受到影响。

关于java - 为什么在我的 JTable 的条件单元格渲染器中出现混合结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14349792/

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