Java 在JTable中,如何呈现带有脏标记的复选框列?
我试图在JTable中的复选框列上显示一个标记,以指示该值是脏的 我想不出一个渲染标记的方法。我尝试在JCheckbox上设置一个图标,但这只是呈现图标而不是复选框。我试过用一个面板,但它弄乱了布局 有人知道最好的方法是什么吗 谢谢 这是我迄今为止尝试过的事情: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
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,我会尝试一下。