【发布时间】:2016-08-07 05:15:57
【问题描述】:
我正在尝试将 prepareRenderer 组件与自定义单元格渲染器一起使用。这个想法是使用 prepareRenderer 绘制整行,并使用客户单元格渲染器进行基于单元格值的自定义。
prepareRenderer 通过突出显示整行按预期工作,但自定义单元格渲染器突出显示的单元格不显示颜色,除非选中。自定义单元格渲染似乎仅适用于单元格选择(突出显示包含 1 但仅在选择时的单元格)。
关于如何使两者齐头并进的任何想法?
下面的代码重现问题。
[![import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import java.awt.*;
public class SortTableWithColors_ extends JFrame {
public static void main(String\[\] args) {
SortTableWithColors_ frame = new SortTableWithColors_();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public SortTableWithColors_() {
Object\[\] columnNames = {"B", "C"};
Object\[\]\[\] data = {{new Integer(1), new Integer(4)},
{new Integer(2), new Integer(5)},
{new Integer(3), new Integer(3)},
{new Integer(4), new Integer(1)}};
// table model
DefaultTableModel model = new DefaultTableModel(data, columnNames);
// set table model in Jtable
// JTable table = new JTable(model);
NewJTable table = new NewJTable(model);
table.setAutoCreateRowSorter(true);
getContentPane().add(new JScrollPane(table));
// Tell the table what to use to render our columns
for (int i = 0; i < 2; i++) {
table.getColumnModel().getColumn(i).setCellRenderer(new NewRenderer());
}
}
// Custom Renderer
public class NewRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent
(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
JLabel cell = (JLabel) super.getTableCellRendererComponent
(table, value, isSelected, hasFocus, row, column);
int rowModel = (int) table.convertRowIndexToModel(row);
int colModel = (int) table.convertColumnIndexToModel(column);
int rowView = (int) table.convertRowIndexToView(row);
int colView = (int) table.convertColumnIndexToView(column);
// set color
// cell.setBackground(new Color(0xFFFFFF));
// cell.setForeground(new Color(0x000000));
//set selection colors
if (isSelected) {
cell.setBackground(new Color(0x4AC3FF));
cell.setForeground(new Color(0x000000)); // AM
}
// Selective cell colouring based on value
// paint cells
int val = (int) value;
if (val == 1) {
cell.setBackground(Color.GREEN);
}
return cell;
}
}
public class NewJTable extends JTable {
public NewJTable(TableModel model) {
super(model);
}
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
// Color row based on a cell value
if (!isRowSelected(row)) {
c.setBackground(getBackground());
int modelRow = convertRowIndexToModel(row);
int val = (int) getModel().getValueAt(modelRow, 0);
if (val == 3) {
c.setBackground(Color.YELLOW);
}
}
return c;
}
}
}]
【问题讨论】:
-
理论上是的,但是您可能会发现您必须不断地进行修改,因为
prepareRenderer会根据其拥有的数据更改TableCellRenderer想要的内容 -
对于这个主题的小小吐槽,你可以看看this,它不是一个“完美”的解决方案,但它是朝着更好的方向迈出的一步,有一些很好的副作用;)
-
这很有帮助,值得深思。我喜欢使用 Jviewport 进行渲染的想法。