1

我有一个 JCheckBox 在 JTable 的最后一列中工作。但是当我为该列中的单元格设置颜色时,它似乎覆盖了渲染的对象(JCheckBox)。

下面的代码片段是我想要做的:

//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.

谁能弄清楚我该如何克服这个问题?谢谢。非常感激

4

1 回答 1

8
  1. DefaultTableCellRenderer基于 a JLabel,所以它永远不会渲染 aJCheckBox
  2. foreground/值可能会作为渲染过程的background一部分被覆盖,这意味着它们将为每个单元格更改,从而丢失您提供的默认值。

您需要提供一个单元格渲染器...

  1. 是基于JCheckBox
  2. 可以在需要时恢复所需的默认值foreground/值...background

这是一个演示基本概念的基本示例...

在此处输入图像描述

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

BooleanRenderer请注意,我从默认实现中偷了JTable;)

于 2013-05-07T01:16:30.723 回答