[英]Setting the color for a JCheckBox cell in a JTable
I have a JCheckBox working in the last column in a JTable. 我有一个JCheckBox在JTable的最后一列中工作。 But when I set the color to the cells in that column, it seem to overwrite the rendered object (JCheckBox).
但是,当我将颜色设置为该列中的单元格时,它似乎会覆盖呈现的对象(JCheckBox)。
The snippet of code below is what I am trying to do: 下面的代码片段是我想要做的:
//Overriding these methods using the DefaultTableModel constructor works .
DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
@Override
public Class getColumnClass(int col)
{
return getValueAt(1, col).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int colIndex)
{
return (colIndex == CHECK_COL);
}
};
JTable table = new JTable(model);
//Constructing and setting a render background and foreground color
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setBackground(Color.BLACK);
renderer.setForeground(new Color(255, 0, 255));
TableColumn column = table.getColumnModel().getColumn(4);
column.setCellRenderer(centerRenderer);
//Now the last column contains just Boolean values, rather than JCheckBox's when I try set the colors.
Can anyone figure out how I can overcome this? 谁能弄清楚我该如何克服? Thanks.
谢谢。 Much appreciated
非常感激
DefaultTableCellRenderer
is based on a JLabel
, so it will never renderer a JCheckBox
DefaultTableCellRenderer
基于JLabel
,因此它将永远不会呈现JCheckBox
foreground
/ background
values are likely to be overridden as part of the rendering process, meaning they will change for each cell, losing there default values you have supplied. foreground
/ background
值可能会被覆盖,这意味着它们将针对每个单元格而更改,从而丢失您提供的默认值。 You need to supply a cell renderer that... 您需要提供一个单元格渲染器...
JCheckBox
JCheckBox
foreground
/ background
values you want when you want them... foreground
/ background
值... This is a basic example which demonstrates the basic concept... 这是一个基本示例,展示了基本概念...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.UIResource;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class BooleanCellEditor {
public static void main(String[] args) {
new BooleanCellEditor();
}
public BooleanCellEditor() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
TableModel model = new AbstractTableModel() {
@Override
public Class<?> getColumnClass(int columnIndex) {
return Boolean.class;
}
@Override
public int getRowCount() {
return 4;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return true;
}
};
JTable table = new JTable(model);
table.setDefaultRenderer(Boolean.class, new BooleanRenderer());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class BooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource {
private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
public BooleanRenderer() {
super();
setHorizontalAlignment(JLabel.CENTER);
setBorderPainted(true);
setOpaque(true);
setText("Hello");
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else {
setBackground(Color.BLACK);
setForeground(new Color(255, 0, 255));
}
setSelected((value != null && ((Boolean) value).booleanValue()));
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
} else {
setBorder(noFocusBorder);
}
return this;
}
}
}
Note, I stole the BooleanRenderer
from the default implementation within JTable
;) 注意,我从
JTable
的默认实现中偷走了BooleanRenderer
;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.