Java 在JTable中使用JCheckBox时背景色闪烁
在我的Java 在JTable中使用JCheckBox时背景色闪烁,java,swing,jtable,Java,Swing,Jtable,在我的JTable上,我正在使用prepareRenderer功能设置行的背景色。我还删除了焦点边框,随后在代码中禁用了行选择 JTable table = new JTable() { private static final long serialVersionUID = -2965586838134675413L; public Component prepareRenderer(TableCellRenderer renderer, int row, int column
JTable
上,我正在使用prepareRenderer
功能设置行的背景色。我还删除了焦点边框,随后在代码中禁用了行选择
JTable table = new JTable() {
private static final long serialVersionUID = -2965586838134675413L;
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248));
((JComponent) c).setBorder(null);
return c;
}
};
DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) {
private static final long serialVersionUID = 9186050244728809804L;
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0:
return Boolean.class;
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int row, int column) {
switch(column) {
case 0:
return true;
default:
return false;
}
}
@SuppressWarnings("unchecked")
@Override
public void setValueAt(Object aValue, int row, int column) {
if (aValue instanceof Boolean && column == 0) {
//System.out.println(aValue);
Vector<Boolean> rowData = (Vector<Boolean>) getDataVector().get(row);
rowData.set(0, (boolean) aValue);
fireTableCellUpdated(row, column);
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false);
注2我还尝试向
JCheckBox
添加一个MouseListener
,但没有成功,因为鼠标侦听器似乎没有连接到JCheckBox
JTable fileList = new JTable() {
private static final long serialVersionUID = -2965586838134675413L;
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248));
((JComponent) c).setBorder(null);
if(c instanceof JCheckBox) {
c.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248));
}
public void mousePressed(MouseEvent e) {
setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248));
}
public void mouseReleased(MouseEvent e) {
setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248));
}
});
}
return c;
}
};
编辑-使用第一个代码示例的SSSCE
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class JTableTest extends JFrame {
private JTableTest() {
super("Button Layout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll = new JScrollPane();
private void createPanel() {
Object[] headers = {"Select", "Title", "Artist", "Length"};
Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"},
{false, "Spanish Train", "Chris De Burgh", "358"}};
JTable table = new JTable() {
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED);
((JComponent) c).setBorder(null); //Left in so it is easier to see problem
return c;
}
};
DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0:
return Boolean.class;
default:
return String.class;
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false); //Left in so it is easier to see problem
scroll.getViewport().add(table);
panel.add(scroll);
getContentPane().add(panel);
}
public static void main(String[] args) {
new JTableTest();
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.GridLayout;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellRenderer;
公共类JTableTest扩展了JFrame{
私有JTableTest(){
超级(“按钮布局”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(1,1));
createPanel();
包装();
setVisible(真);
}
JPanel面板=新JPanel(新网格布局(1,1));
JScrollPane scroll=新建JScrollPane();
私有void createPanel(){
对象[]标题={“选择”、“标题”、“艺术家”、“长度”};
对象[][]sampleData={{true,“蝙蝠出地狱”,“肉饼”,“673”},
{假,“西班牙火车”、“克里斯·德伯格”、“358”};
JTable table=新的JTable(){
公共组件预渲染器(TableCellRenderer渲染器,int行,int列){
组件c=super.prepareRenderer(呈现器、行、列);
c、 挫折背景(第%2行==1?颜色。白色:颜色。红色);
((JComponent)c).setboorder(null);//保留在左键中,以便更容易看到问题
返回c;
}
};
DefaultTableModel tableModel=新的DefaultTableModel(样本数据、标题){
@凌驾
公共类getColumnClass(int columnIndex){
开关(列索引){
案例0:
返回Boolean.class;
违约:
返回字符串.class;
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false);//保留,以便更容易看到问题
scroll.getViewport().add(表);
面板。添加(滚动);
getContentPane().add(面板);
}
公共静态void main(字符串[]args){
新JTableTest();
}
}
您在JTable
实例中缺少一个prepareEditor
重写,我在您的示例中添加了一个。单击复选框时,显示的是编辑器组件而不是渲染器组件。您还需要准备该组件以获得所需的颜色
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
private JTableTest() {
super("Button Layout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll = new JScrollPane();
private void createPanel() {
Object[] headers = {"Select", "Title", "Artist", "Length"};
Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"},
{false, "Spanish Train", "Chris De Burgh", "358"}};
JTable table = new JTable() {
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED);
((JComponent) c).setBorder(null); //Left in so it is easier to see problem
return c;
}
@Override
public Component prepareEditor(TableCellEditor editor, int row, int column) {
Component c = super.prepareEditor(editor, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED);
((JComponent) c).setBorder(null); //Left in so it is easier to see problem
return c;
}
};
DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0:
return Boolean.class;
default:
return String.class;
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false); //Left in so it is easier to see problem
scroll.getViewport().add(table);
panel.add(scroll);
getContentPane().add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater (
new Runnable() {
@Override
public void run() {
new JTableTest();
}
}
);
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.GridLayout;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableCellEditor;
导入javax.swing.table.TableCellRenderer;
@抑制警告(“串行”)
公共类JTableTest扩展了JFrame{
私有JTableTest(){
超级(“按钮布局”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(1,1));
createPanel();
包装();
setVisible(真);
}
JPanel面板=新JPanel(新网格布局(1,1));
JScrollPane scroll=新建JScrollPane();
私有void createPanel(){
对象[]标题={“选择”、“标题”、“艺术家”、“长度”};
对象[][]sampleData={{true,“蝙蝠出地狱”,“肉饼”,“673”},
{假,“西班牙火车”、“克里斯·德伯格”、“358”};
JTable table=新的JTable(){
公共组件预渲染器(TableCellRenderer渲染器,int行,int列){
组件c=super.prepareRenderer(呈现器、行、列);
c、 挫折背景(第%2行==1?颜色。白色:颜色。红色);
((JComponent)c).setboorder(null);//保留在左键中,以便更容易看到问题
返回c;
}
@凌驾
公共组件prepareEditor(TableCellEditor编辑器,int行,int列){
组件c=super.prepareEditor(编辑器、行、列);
c、 挫折背景(第%2行==1?颜色。白色:颜色。红色);
((JComponent)c).setboorder(null);//保留在左键中,以便更容易看到问题
返回c;
}
};
DefaultTableModel tableModel=新的DefaultTableModel(样本数据、标题){
@凌驾
公共类getColumnClass(int columnIndex){
开关(列索引){
案例0:
返回Boolean.class;
违约:
返回字符串.class;
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false);//保留,以便更容易看到问题
scroll.getViewport().add(表);
面板。添加(滚动);
getContentPane().add(面板);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(
新的Runnable(){
@凌驾
公开募捐{
新JTableTest();
}
}
);
}
}
要更快地获得更好的帮助,请发布一个或。@andreThompson。很抱歉。我认为JTable代码已经足够了。你知道是什么引起的吗?@Dan也许你应该修剪一下其他部分,因为你包括了一个SSCCE。更好吗?“现在是一个MCVE/SSCCE,所以是的。”还有关于如何修复的建议吗?…什么?我不理解
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
private JTableTest() {
super("Button Layout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll = new JScrollPane();
private void createPanel() {
Object[] headers = {"Select", "Title", "Artist", "Length"};
Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"},
{false, "Spanish Train", "Chris De Burgh", "358"}};
JTable table = new JTable() {
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED);
((JComponent) c).setBorder(null); //Left in so it is easier to see problem
return c;
}
@Override
public Component prepareEditor(TableCellEditor editor, int row, int column) {
Component c = super.prepareEditor(editor, row, column);
c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED);
((JComponent) c).setBorder(null); //Left in so it is easier to see problem
return c;
}
};
DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0:
return Boolean.class;
default:
return String.class;
}
}
};
table.setModel(tableModel);
table.setRowSelectionAllowed(false); //Left in so it is easier to see problem
scroll.getViewport().add(table);
panel.add(scroll);
getContentPane().add(panel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater (
new Runnable() {
@Override
public void run() {
new JTableTest();
}
}
);
}
}