简体   繁体   English

在JTable中为JCheckBox单元格设置颜色

[英]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 非常感激

  1. DefaultTableCellRenderer is based on a JLabel , so it will never renderer a JCheckBox DefaultTableCellRenderer基于JLabel ,因此它将永远不会呈现JCheckBox
  2. The 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... 您需要提供一个单元格渲染器...

  1. Is based on JCheckBox 基于JCheckBox
  2. Can restore the default 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM