在JTable中,如何使用脏标记呈现复选框列?

时间:2010-03-08 12:31:17

标签: java swing jtable

我正在尝试在JTable中的复选框列上显示一个标记,以指示该值是脏的。

我无法想出一种渲染标记的方法。我已经尝试在JCheckbox上设置一个图标,但这只是呈现图标而不是复选框。我尝试使用面板,但它会弄乱布局。

有没有人知道最好的方法是什么?

由于

到目前为止,这是我尝试过的事情:

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;

public class DirtyCheckboxRenderer extends JCheckBox implements TableCellRenderer {

    private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);


    public DirtyCheckboxRenderer() {
        setHorizontalAlignment(SwingConstants.CENTER);
        setBorderPainted(true);
    }


    @Override
    public Component getTableCellRendererComponent(JTable table, 
                                                   Object value, 
                                                   boolean isSelected, 
                                                   boolean hasFocus, 
                                                   int row, 
                                                   int column) {

        setForegroundColor(table, isSelected);
        setBackgroundColor(table, isSelected);
        setCheckboxState(value);
        setBorder(hasFocus);
        setDirtyMarkerIcon();

        return this;

    }


    private void setCheckboxState(Object value) {
        boolean checked = value != null && ((Boolean) value).booleanValue();
        setSelected(checked);
    }


    private void setBorder(boolean hasFocus) {
        if (hasFocus) {
            setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
        } else {
            setBorder(this.noFocusBorder);
        }
    }


    private void setForegroundColor(JTable table, boolean isSelected) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
        } else {
            setForeground(table.getForeground());
        }
    }


    private void setBackgroundColor(JTable table, boolean isSelected) {

        if (isSelected) { 
            setBackground(table.getSelectionBackground());
        } else {
            setBackground(table.getBackground());
        }

    }

    private void setDirtyMarkerIcon() {
        boolean columnIsDirty = true; //TODO 

        if (columnIsDirty) {
            Icon icon = getDirtyMarkerIcon();
            setHorizontalTextPosition(SwingConstants.TRAILING);
            setIcon(icon);
        } else {
            setIcon(null);
        }

    }


    private Icon getDirtyMarkerIcon() {

        //TODO
        return null; //
    }


} 

4 个答案:

答案 0 :(得分:2)

如果您坚持让“脏图标”显示在复选框后面,那么您将不得不使用面板。

为了防止列的布局损坏,您应该始终渲染图标,即使它是透明的占位符图标。

答案 1 :(得分:1)

一种方便的方法是让DirtyCheckboxRenderer实现Icon接口并在构造函数中执行setIcon(this)paintIcon()方法为您提供了对该组件的引用,xy坐标将正确反映您的文本位置设置。

答案 2 :(得分:0)

如果在TableModel的getColumnClass方法中返回布尔值,JTable应该自动呈现一个Checkbox。

答案 3 :(得分:0)

嗯,一个简单的方法是更改​​复选框的文本并在其前面加上星号。