Setting the color for a JCheckBox cell in a JTable

北战南征 提交于 2019-12-11 10:00:03

问题


I have a JCheckBox working in the last column in a JTable. But when I set the color to the cells in that column, it seem to overwrite the rendered object (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:


  1. DefaultTableCellRenderer is based on a JLabel, so it will never renderer a 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.

You need to supply a cell renderer that...

  1. Is based on JCheckBox
  2. Can restore the default foreground/background values you want when you want them...

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



来源:https://stackoverflow.com/questions/16409494/setting-the-color-for-a-jcheckbox-cell-in-a-jtable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!