首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从未调用过JTable TableCellRenderer getTableCellRendererComponent()

从未调用过JTable TableCellRenderer getTableCellRendererComponent()
EN

Stack Overflow用户
提问于 2013-08-05 21:43:28
回答 2查看 1.8K关注 0票数 1

我正在尝试实现一个JTable,它将根据单元格的类型来格式化列中的单元格。我正在实现TableCellRenderer的‘`getTableCellRendererComponent()’方法来实现这一点。

问题是我的getTableCellRendererComponent()方法似乎从未被调用过,因为代码中的测试输出从未出现在控制台中。

下面是渲染器的代码:

代码语言:javascript
复制
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()方法)。应该是不相关的。

代码语言:javascript
复制
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);
}
}
EN

回答 2

Stack Overflow用户

发布于 2013-08-07 22:00:25

设置默认渲染器的代码没有注册Object对象。因为rows[][]被声明为持有类型"Object“,所以从未调用过渲染器,因为传递给它的是Object对象,而不是GregorianCalendars、Strings或Recipes。

票数 2
EN

Stack Overflow用户

发布于 2016-12-14 09:53:23

我遇到了同样的问题。好了,你已经找到了它表现成这样的原因了。所以,这就是解决方案。

JTable使用TableModel接口,该接口为表提供有关它所保存的数据的所有信息。此信息还包含与列关联的类。因此,基本上,您需要做的是使用类派生TableModelAbstractTableModel,这些类将保存表的数据并覆盖public Class<?> getColumnClass(int columnIndex)方法。在此增强之后,您可以使用自定义的TableCellRenderer。在您的代码中,您为JTable提供了一个DefaultTableModel,它为任何列返回Object,这就是它不起作用的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18059715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档