简体   繁体   English

从未调用过JTable TableCellRenderer getTableCellRendererComponent()

[英]JTable TableCellRenderer getTableCellRendererComponent() never called

I am trying to implement a JTable which will format cells in columns in ways depending on their type. 我正在尝试实现一个JTable ,该JTable将根据单元格的类型以几种方式格式化单元格中的单元格。 I am implementing TableCellRenderer's `getTableCellRendererComponent()' method to achieve this. 我正在实现TableCellRenderer的`getTableCellRendererComponent()'方法来实现此目的。

The problem is that my getTableCellRendererComponent() method never seems to be called, as the test output in the code never appears in the console. 问题是我的getTableCellRendererComponent()方法似乎从未被调用过,因为代码中的测试输出永远不会出现在控制台中。

Here is the code for the renderer: 这是渲染器的代码:

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;
}

} }

Here is the code (edited for relevant code) which generates the table. 这是生成表的代码(为相关代码进行编辑)。 Note that getRows() is my custom method that returns the data to be rendered and also that I am using netbeans (hence the abridged initComponents() method). 请注意,getRows()是我的自定义方法,该方法返回要渲染的数据,并且我正在使用netbeans(因此,使用了缩写的initComponents()方法)。 Should be irrelevant. 应该无关紧要。

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);
}
}

The code which set the default renderers doesn't have the Object object registered. 设置默认渲染器的代码未注册Object对象。 Because the rows[][] was declared to hold type "Object," the renderer was never called because it was passed Object objects, not GregorianCalendar s, String s, or Recipe s. 因为声明rows[][]持有类型“ Object”,所以从未调用渲染器,因为它是传递给Object对象的,而不是GregorianCalendarStringRecipe

I ran into the same issue. 我遇到了同样的问题。 Well, you have already found the reason why it behaves like this. 好吧,您已经找到了它表现出这种行为的原因。 So, here is the solution. 所以,这是解决方案。

JTable works with TableModel interface that supplies table with all information about the data it holds. JTableTableModel接口一起使用,该接口向表提供有关其所保存数据的所有信息。 This information also contains the class associated with a column. 此信息还包含与列关联的类。 So basically, what you need to do is to derive TableModel or AbstractTableModel with your class which will hold the data for the table and override the method public Class<?> getColumnClass(int columnIndex) . 因此,基本上,您需要做的是使用您的类派生TableModelAbstractTableModel ,这些类将保存表的数据并覆盖方法public Class<?> getColumnClass(int columnIndex) After that enhancement you can use your custom TableCellRenderer . 增强之后,您可以使用自定义TableCellRenderer In your code you supplied JTable with a DefaultTableModel which returns Object for any column and that's why it did not work out. 在您的代码中,您为JTable提供了一个DefaultTableModel ,它为任何列返回Object ,这就是为什么它不起作用的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM