Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JTable中使用JCheckBox时背景色闪烁_Java_Swing_Jtable - Fatal编程技术网

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();
                }
            }
        );
    }
}