我正在尝试实现一个JTable
,它会根据类型的方式格式化列中的单元格。我正在实现TableCellRenderer的`getTableCellRendererComponent()'方法来实现这一点。
问题是我的getTableCellRendererComponent()
方法似乎永远不会被调用,因为代码中的测试输出永远不会出现在控制台中。
以下是渲染器的代码:
public class MenuSheetTableCellRenderer extends JLabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column){
JLabel label = new JLabel();
System.out.println("test");
if( value instanceof GregorianCalendar ){
System.out.println("test2");
GregorianCalendar timeGregorianCalendar = (GregorianCalendar) value;
Date time = timeGregorianCalendar.getTime();
SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm a");
String mealTime = timeFormat.format(time);
label.setText(mealTime);
}
else if( value instanceof MealChoice){
label.setText(value.toString());
}
else if( value instanceof Recipe){
label.setText(" " + value.toString());
}
if (value instanceof String || value instanceof MealChoice){
label.setFont(new Font("Tahoma", Font.BOLD, 11));
}
return label;
}
}
以下是生成表格的代码(针对相关代码编辑)。请注意,getRows()是我的自定义方法,它返回要呈现的数据以及我正在使用netbeans(因此删除了initComponents()方法)。应该是无关紧要的。
private void initComponents() {
menuSheetTable = new javax.swing.JTable();
menuSheetTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
menuSheetTable.setEnabled(false);
menuSheetTable.setFocusable(false);
menuSheetTable.setShowHorizontalLines(false);
menuSheetTable.setShowVerticalLines(false);
jScrollPane1.setViewportView(menuSheetTable);
}
public void renderTable(){
String[] columns = { "Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
Object[][] rows = getRows();
DefaultTableModel menuSheetModel = new DefaultTableModel( rows, columns );
menuSheetTable.setModel( menuSheetModel );
MenuSheetTableCellRenderer renderer = new MenuSheetTableCellRenderer();
try{
menuSheetTable.setDefaultRenderer(Class.forName("java.lang.String"), renderer);
menuSheetTable.setDefaultRenderer(Class.forName("java.util.GregorianCalendar"), renderer);
menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.MealChoice"), renderer);
menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.Recipe"), renderer);
}
catch( ClassNotFoundException e){
System.exit(1);
}
}
答案 0 :(得分:2)
设置默认渲染器的代码没有注册Object
对象。因为rows[][]
被声明为包含“Object”类型,所以从未调用渲染器,因为它传递了Object
个对象,而不是GregorianCalendar
s,String
s或{{ 1}} S上。
答案 1 :(得分:0)
我遇到了同样的问题。好吧,你已经找到了它的行为如此的原因。所以,这是解决方案。
JTable
与TableModel
接口配合使用,该接口为表提供有关其所拥有数据的所有信息。此信息还包含与列关联的类。基本上,您需要做的是使用您的类派生TableModel
或AbstractTableModel
,该类将保存表的数据并覆盖方法public Class<?> getColumnClass(int columnIndex)
。
完成该增强后,您可以使用自定义TableCellRenderer
。
在您的代码中,您提供了JTable
DefaultTableModel
,其中Object
可返回任何列,这就是为什么它没有成功。