无法使用自定义渲染器
Unable to use custom renderer
我正在尝试为 jTable 创建自定义单元格渲染器。我承认,即使阅读了这么多书,我仍然无法真正理解如何将自定义组件添加为单元格渲染器。我想添加 JCheckBox
渲染器。
到目前为止我已经尝试过这段代码:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class test extends JFrame {
public static DefaultTableModel model = new DefaultTableModel();
public static void main (String args[]){
JTable table = new JTable();
table.setDefaultRenderer(String.class, new CheckboxTableCellRenderer());
table.setModel(model);
model.addRow(new Object[] {"testData2","testData1"});
JFrame frame = new JFrame();
frame.add(list);
frame.pack();
frame.setVisible(true);
}
public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
TableCellRenderer {
@Override
public Component getTableCellRendererComponent( JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column ){
setComponentOrientation(table.getComponentOrientation());
setFont(table.getFont());
setText(String.valueOf(value));
setBackground(table.getBackground());
setForeground(table.getForeground());
setSelected(isSelected);
setEnabled(table.isEnabled());
return this;
}
}
}
但是无论我尝试向模型添加哪一行,它都不会在 table 中显示任何数据。
任何人都可以告诉我正确的方法吗?
工作示例:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class test extends JFrame {
public static DefaultTableModel model = new DefaultTableModel(0, 4) {
public Class getColumnClass(int columnIndex) {
if (columnIndex == 2 || columnIndex == 3) {
return Boolean.class;
} else {
return Object.class;
}
}
};
public static void main (String args[]){
JTable table = new JTable();
table.setDefaultRenderer(Boolean.class, new CheckboxTableCellRenderer());
model.addRow(new Object[] {"testData2","testData1",false,true});
table.setModel(model);
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.setSize(640,480);
frame.setVisible(true);
}
public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
TableCellRenderer {
@Override
public Component getTableCellRendererComponent( JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column ){
setComponentOrientation(table.getComponentOrientation());
setFont(table.getFont());
if (!isSelected) {
setBackground(table.getBackground());
setForeground(table.getForeground());
} else {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
setSelected((Boolean) value);
setEnabled(table.isEnabled());
return this;
}
}
}
您只需要 Boolean.class
的自定义渲染器,但 DefaultTableModel
只需要 returns Object.class
,因此覆盖 getColumnClass
。可能还需要指定列数,请参阅构造函数调用。
isSelected
与单元格中的值无关,而是与是否选择了 cell/row 并且应该以相反(或其他)颜色显示有关。
还添加了一个JScrollPane
,可能不需要。
编辑看起来仍然很奇怪,您可能还需要定义一个自定义编辑器,但不确定。
编辑:如果按照@trashgod 的建议,我们只是放弃 setDefaultRenderer()
调用,它看起来很不错。
我正在尝试为 jTable 创建自定义单元格渲染器。我承认,即使阅读了这么多书,我仍然无法真正理解如何将自定义组件添加为单元格渲染器。我想添加 JCheckBox
渲染器。
到目前为止我已经尝试过这段代码:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class test extends JFrame {
public static DefaultTableModel model = new DefaultTableModel();
public static void main (String args[]){
JTable table = new JTable();
table.setDefaultRenderer(String.class, new CheckboxTableCellRenderer());
table.setModel(model);
model.addRow(new Object[] {"testData2","testData1"});
JFrame frame = new JFrame();
frame.add(list);
frame.pack();
frame.setVisible(true);
}
public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
TableCellRenderer {
@Override
public Component getTableCellRendererComponent( JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column ){
setComponentOrientation(table.getComponentOrientation());
setFont(table.getFont());
setText(String.valueOf(value));
setBackground(table.getBackground());
setForeground(table.getForeground());
setSelected(isSelected);
setEnabled(table.isEnabled());
return this;
}
}
}
但是无论我尝试向模型添加哪一行,它都不会在 table 中显示任何数据。
任何人都可以告诉我正确的方法吗?
工作示例:
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class test extends JFrame {
public static DefaultTableModel model = new DefaultTableModel(0, 4) {
public Class getColumnClass(int columnIndex) {
if (columnIndex == 2 || columnIndex == 3) {
return Boolean.class;
} else {
return Object.class;
}
}
};
public static void main (String args[]){
JTable table = new JTable();
table.setDefaultRenderer(Boolean.class, new CheckboxTableCellRenderer());
model.addRow(new Object[] {"testData2","testData1",false,true});
table.setModel(model);
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.setSize(640,480);
frame.setVisible(true);
}
public static class CheckboxTableCellRenderer<E> extends JCheckBox implements
TableCellRenderer {
@Override
public Component getTableCellRendererComponent( JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column ){
setComponentOrientation(table.getComponentOrientation());
setFont(table.getFont());
if (!isSelected) {
setBackground(table.getBackground());
setForeground(table.getForeground());
} else {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
setSelected((Boolean) value);
setEnabled(table.isEnabled());
return this;
}
}
}
您只需要 Boolean.class
的自定义渲染器,但 DefaultTableModel
只需要 returns Object.class
,因此覆盖 getColumnClass
。可能还需要指定列数,请参阅构造函数调用。
isSelected
与单元格中的值无关,而是与是否选择了 cell/row 并且应该以相反(或其他)颜色显示有关。
还添加了一个JScrollPane
,可能不需要。
编辑看起来仍然很奇怪,您可能还需要定义一个自定义编辑器,但不确定。
编辑:如果按照@trashgod 的建议,我们只是放弃 setDefaultRenderer()
调用,它看起来很不错。