java – 覆盖JTable的DefaultTableCellRenderer以使JTable中的所
我有一个问题,我无法摆脱.
你知道,我对使用JTables相当新,所以答案可能很简单,但我找不到解决方案:/ 所以,我有一个使用AbstractTableModel的JTable,它覆盖了 public Class<?> getColumnClass(int columnIndex_p) 方法,告诉要显示的每列的类型.其中一个是布尔值. 当我创建一个简单的JTable时,使用 table_l = new JTable(new MyTableModel()); 一切都很好,并使用复选框(开/关)正确显示布尔值. 现在,我想将文本集中在每个单元格上(以后可能会有更多选项). 所以我为每一列定义了一个新的DefaultTableCellRenderer,如下所示: DefaultTableCellRenderer cellRenderer_l = new DefaultTableCellRenderer() { public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) { // delegate the rendering part to the default renderer (am i right ???) Component comp = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); return comp; } } 然后我只需将此CellRender的水平对齐设置为: cellRenderer_l.setHorizontalAlignment(JLabel.CENTER); 然后我在JTable的每一列上安装这个新的CellRenderer: for (int i = 0; i < table_l.getColumnCount(); ++i) { table_l.getColumnModel().getColumn(i).setCellRenderer(cellRenderer_l); } 但是,使用新的CellRenderer,显示的JTable不再使用我的TableModel的getColumnClass()方法,因此只在布尔值上显示“true / false”字符串. 我不知道如何使它仍然像以前一样使用getColumnClass(). 如果有人有答案…… 编辑: 解决方法
要将相同的视觉装饰应用于所有渲染组件(如果这是您真正想要的,请注意,它可能会有可用性惩罚!)您可以覆盖JTable的preparedRenderer方法:
@Override public Component prepareRenderer(TableCellRenderer renderer,int column) { Component comp = super.prepareRenderer(...); if (comp instanceof JLabel) { ((JLabel) comp).setHorizontalAlignment(...); } return comp; } 顺便说一句:这种方法违反了规则,没有将JSomething子类化为应用程序需求.您可以考虑使用SwingX,它正式支持可视化装饰渲染组件.因此,您可以使用表格注册荧光笔,而不是子类化: JXTable table = ... table.addHighlighter(new AlignmentHighlighter(CENTER),HighlightPredicate.ALWAYS); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |