多语言展示
当前在线:934今日阅读:176今日分享:34

Java JTable的使用

最近在使用JTable做交易系统的界面,因为之前没有类似经验,感觉做起来比较麻烦。好在最终都能把想要的效果做出来了,现总结一下经验,供日后查阅参考。
方法/步骤
1

设置单元格的渲染器为复选框,如下://设置表格和表头的默认渲染器simpleTable.setDefaultRenderer(Object.class, simpleTableRender);simpleTable.getTableHeader().setDefaultRenderer(headerRenderer);//设置单元格的渲染器checkBoxRenderer = new CheckBoxRenderer(simpleTable);       simpleTable.getColumnModel().getColumn(0).setCellRenderer(checkBoxRenderer);

2

设置单元格的渲染器和编辑器为下拉框,如下:simpleTable.getColumnModel().getColumn(3).setCellRenderer(comboBoxRenderer);      simpleTable.getColumnModel().getColumn(3).setCellEditor(comboBoxCellEditor);

3

设置排序方法,如下:sorter = new TableRowSorter((LogonStatusTableModel) simpleTable.getModel());simpleTable.setRowSorter(sorter);ArrayList list = new ArrayList();list.add(new TableRowSorter.SortKey(1, SortOrder.ASCENDING));sorter.setSortKeys(list);sorter.sort();sorter.setSortable(0, false);

4

设置表头的排序标识按钮,如下:simpleTable.getTableHeader().addMouseListener(new HeaderMouseListener());class HeaderMouseListener extends MouseAdapter {        @Override        public void mouseClicked(MouseEvent e) {            JTableHeader h = (JTableHeader) e.getSource();            TableColumnModel columnModel = h.getColumnModel();            TableCellRenderer tcr = h.getDefaultRenderer();            int viewColumn = columnModel.getColumnIndexAtX(e.getX());            if (viewColumn < 0)                return;            int column = columnModel.getColumn(viewColumn).getModelIndex();            if (column != -1 && tcr instanceof LogonStatusContentHeaderRenderer) {                LogonStatusContentHeaderRenderer sbr = (LogonStatusContentHeaderRenderer) tcr;                sbr.setSelectedColumn(column);            }        }        @Override        public void mouseReleased(MouseEvent e) {            ((JTableHeader) e.getSource()).repaint();        }    }

5

设置数据返回值类型,如下://返回布尔值@Override  public Class getColumnClass(int columnIndex) {        if (columnIndex == 0)            return Boolean.class;        else            return super.getColumnClass(columnIndex);}//返回Double类型,排序时会按Double类型排序@Overridepublic Class getColumnClass(int columnIndex) {        if(columnIndex==2){            return Double.class;        }else            return super.getColumnClass(columnIndex);}

7

设置列的值,如下:public Object getValueAt(int row, int column) {                            if (row >= 0) {            SysParamStruct info = localMap.get(String.valueOf(row));            if (info == null) {                System.out.println('info   null');            }                        if (info != null) {                                if (columnsOrder.elementAt(column) == EnumSysParaColumn.PARA_NAME) {                    return info.getShortDesc();                } else if (columnsOrder.elementAt(column) == EnumSysParaColumn.PARA_DESC) {                    return info.getLongDesc();                } else if (columnsOrder.elementAt(column) == EnumSysParaColumn.VALUE) {                    return info.getValue();                }  else if (columnsOrder.elementAt(column) == EnumSysParaColumn.STATUS) {                    return info.getStatus();                }                                        }                    }        return '';    }

8

使编辑的列值生效,如下:public void setValueAt (Object value, int row, int column) {        SysParamStruct info = localMap.get(String.valueOf(row));        if (columnsOrder.elementAt(column) == EnumSysParaColumn.VALUE) {            info.setValue((String) value);            localMap.put(String.valueOf(row), info);        }        if (columnsOrder.elementAt(column) == EnumSysParaColumn.STATUS) {            char status = 0;            switch ((StatusType)value) {                case Active :                    status = StatusType.Active.getValue();                    break;                case Suspended :                    status = StatusType.Suspended.getValue();                                  break;                case Deleted :                    status = StatusType.Deleted.getValue();                    break;                default :                    break;            }                        info.setStatus(status);            localMap.put(String.valueOf(row), info);        }        fireTableCellUpdated(row, column);    }

9

ComboBoxRenderer里面的内容,如下:@Override    public Component getTableCellRendererComponent(        JTable table,        Object value,        boolean isSelected,        boolean hasFocus,        int row,        int column) {        oddColor = ResManager.getColor('Trade.OrderBook.TableCell.OddColor');        evenColor = ResManager.getColor('Trade.OrderBook.TableCell.EvenColor');        fgColor = ResManager.getColor('Trade.OrderBook.TableCell.textColor');        highlightBgColor = HVResMgr.getColor('Trade.OrderBook.TableCell.HighlightColor');        //set line background color        if ((row % 2) == 0) {            bgColor = oddColor;        }        else {            bgColor = evenColor;        }        // set highlight color        if (isSelected) {            bgColor = highlightBgColor;        }        //calculate the font size        double ratio = 1.0;        if (table instanceof BaseTable) {            ratio = ((BaseTable) table).getRatio();        }        int fontSize = (int) (font.getSize() * ratio);        font = new Font(font.getName(), font.getStyle(), fontSize);        this.comboBox.setBorder(null);        this.comboBox.setBackground(bgColor);        this.comboBox.setForeground(fgColor);        if (column == 3) {            StatusType status = null;            switch ((Character) value) {                case 'A' :                    status = StatusType.Active;                    break;                case 'S' :                    status = StatusType.Suspended;                    break;                case 'D' :                    status = StatusType.Deleted;                    break;                default :                    break;            }            this.comboBox.setSelectedItem(status);        }        return this.comboBox;    }

10

ComboBoxCellEditor里面的内容,如下:public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {        if (column == 3) {            StatusType status = null;            switch ((Character) value) {                case 'A' :                    status = StatusType.Active;                    break;                case 'S' :                    status = StatusType.Suspended;                    break;                case 'D' :                    status = StatusType.Deleted;                    break;                default :                    break;            }            this.comboBox.setSelectedItem(status);        }        return this.comboBox;    }    @Override    public Object getCellEditorValue() {        return this.comboBox.getSelectedItem();    }

推荐信息