我正在尝试实现一个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);
}
}

最佳答案

设置默认渲染器的代码未注册Object对象。因为rows[][]被声明为持有“ Object”类型,所以渲染器从未被调用,因为它传递了Object对象,而不是GregorianCalendar s,String s或Recipe s。

关于java - 从未调用过JTable TableCellRenderer getTableCellRendererComponent(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18059715/

10-10 21:51