我正在尝试在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; //
}
}
答案 0 :(得分:2)
如果您坚持让“脏图标”显示在复选框后面,那么您将不得不使用面板。
为了防止列的布局损坏,您应该始终渲染图标,即使它是透明的占位符图标。
答案 1 :(得分:1)
一种方便的方法是让DirtyCheckboxRenderer
实现Icon
接口并在构造函数中执行setIcon(this)
。 paintIcon()
方法为您提供了对该组件的引用,x
和y
坐标将正确反映您的文本位置设置。
答案 2 :(得分:0)
如果在TableModel的getColumnClass方法中返回布尔值,JTable应该自动呈现一个Checkbox。
答案 3 :(得分:0)
嗯,一个简单的方法是更改复选框的文本并在其前面加上星号。