Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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中,如何呈现带有脏标记的复选框列?_Java_Swing_Jtable - Fatal编程技术网

Java 在JTable中,如何呈现带有脏标记的复选框列?

Java 在JTable中,如何呈现带有脏标记的复选框列?,java,swing,jtable,Java,Swing,Jtable,我试图在JTable中的复选框列上显示一个标记,以指示该值是脏的 我想不出一个渲染标记的方法。我尝试在JCheckbox上设置一个图标,但这只是呈现图标而不是复选框。我试过用一个面板,但它弄乱了布局 有人知道最好的方法是什么吗 谢谢 这是我迄今为止尝试过的事情: import java.awt.Component; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JTable; import j

我试图在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; //
    }


} 

如果在TableModel的getColumnClass方法中返回Boolean,则JTable应自动呈现复选框。

如果在TableModel的getColumnClass方法中返回Boolean,则JTable应自动呈现复选框。

如果坚持在复选框后面显示“脏图标”,则,然后你必须使用一个面板


为了防止列的布局被破坏,您应该始终呈现图标,即使它是一个透明的占位符图标。

如果您坚持在复选框后面显示“脏图标”,则必须使用面板


为了防止列的布局被破坏,您应该始终呈现图标,即使它是一个透明的占位符图标。

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

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

一种方便的方法是让
DirtyCheckboxRenderer
实现接口,并在构造函数中执行
setIcon(this)
paintIcon()
方法为您提供组件的参考,并且
x
y
坐标将正确反映您的文本位置设置

一种方便的方法是让
DirtyCheckboxRenderer
实现接口,并在构造函数中执行
setIcon(this)
paintIcon()
方法为您提供组件的参考,并且
x
y
坐标将正确反映您的文本位置设置

您可以使用
JCheckBox
提供一个简单的示例来说明您现在拥有的功能。谢谢Peter。原始帖子已编辑。您可以使用
JCheckBox
提供一个简单的示例来说明您现在拥有的内容。谢谢Peter。原始帖子已编辑。谢谢keulej,但我得到了一个复选框ok。我的问题是显示图标。谢谢keulej,但是我得到了一个复选框ok。我的问题是显示图标。谢谢timmyd,我会尝试一下。谢谢timmyd,我会尝试一下。