Java核心技术(高级Swing)二表格

    技术2022-05-18  18

    简单表格

    JTable并不存储它自己的数据,而是从一个表格模型中获得它的数据。JTable类有一个构造器能够将一个二维对象数组包装到一个默认的模型。简单表格直接调用每个对象上的toString方法来显示它们。

    表格模型

    可以利用AbstractTableModel类来实现表格模型,它实现了大部分必需的方法,仅仅需要实现如下方法:

    public int getRowCount();

    public int getColumnCount();

    public Object getValueAt(int row, int column);

    对行和列的操作

    JTable类将有关表格列的信息存放在类型为TableColumn的对象中,由一个TableColumnModel对象负责管理这些列。可以向

    JTable中添加排序机制,如果要对排序行为进行细粒度的控制,就必需像JTable中安装一个TableRowSorter<M>对象,并对其进行定

    制化。类型参数M表示表格模型,必须是TableModel接口的子类型。TableRowSorter还可以有选择性地隐藏行,这种处理称为过滤器。

    想要激活过滤机制,需要设置RowFilter。

    单元格的绘制和编辑

    列的类型确定了单元格应该如何绘制。Boolean和Icon类型有默认的绘制器,它们将绘制为复选框或图标,而对于其他类型,都需

    要安装定制的绘制器。表格单元绘制器实现TableCellRenderer接口。为了使单元格可编辑,表格模型必须通过定义isCellEditable方法

    指明哪些单元格是可编辑的。定制编辑器:创建一个定制的单元格编辑器,需要实现TableCellEditor接口。AbstractCellEditor类可以

    用于负责事件处理的细节。

    public class TableDemo extends JFrame { public static void main(String[] args){ new TableDemo().setVisible(true); } public TableDemo() { setTitle("PlanetTable"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //简单表格,二维数组提供数据 JTable plainTable = new JTable(cells, columnNames); plainTable.setAutoCreateRowSorter(true); //AbstractTableModel实现表格模型 JTable tableModel = new JTable(new AbstractTableModel(){ public Class<?> getColumnClass(int c){ return cells[0][c].getClass(); } public int getColumnCount() { return cells[0].length; } public int getRowCount() { return cells.length; } public Object getValueAt(int r, int c) { return cells[r][c]; } public String getColumnName(int c){ return columnNames[c]; } public void setValueAt(Object obj, int r, int c){ cells[r][c] = obj; } public boolean isCellEditable(int r, int c){ return c == MOONS_COLUMN || c == GASEOUS_COLUMN || c == COLOR_COLUMN; } }); //自定义绘制方式 tableModel.setDefaultRenderer(Color.class, new TableCellRenderer(){ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int colum) { JComponent component = new JPanel(); component.setBackground((Color)value); if(hasFocus) component.setBorder(new EtchedBorder()); else component.setBorder(null); return component; } }); tableModel.setRowSelectionAllowed(false); //自定义编辑方式 tableModel.setDefaultEditor(Color.class, new ColorCellEditor()); //默认的编辑器 JComboBox comboBox = new JComboBox(); for(int i =0;i<20;i++){ comboBox.addItem(i); } tableModel.getColumnModel().getColumn(MOONS_COLUMN).setCellEditor(new DefaultCellEditor(comboBox)); //自定义排序方式 final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel.getModel()); tableModel.setRowSorter(sorter); sorter.setSortable(PLANET_COLUMN, false); sorter.setComparator(RADIUS_COLUMN, new Comparator<Object>(){ public int compare(Object o1, Object o2) { double d1 = Double.parseDouble(o1.toString()); double d2 = Double.parseDouble(o2.toString()); return (int)(d1 - d2); } }); JPanel panel = new JPanel(); panel.add(new JScrollPane(plainTable)); panel.add(new JScrollPane(tableModel)); add(panel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); final JToggleButton button = new JToggleButton("过滤"); button.addActionListener(new ActionListener(){ //设置过滤方式 public void actionPerformed(ActionEvent event) { if(button.isSelected()){ sorter.setRowFilter(RowFilter.regexFilter(".*[s]$", PLANET_COLUMN)); }else{ sorter.setRowFilter(RowFilter.regexFilter("", PLANET_COLUMN)); } } }); buttonPanel.add(button); add(buttonPanel, BorderLayout.SOUTH); pack(); } //自定义编辑 private class ColorCellEditor extends AbstractCellEditor implements TableCellEditor{ public ColorCellEditor() { panel = new JPanel(); colorChooser = new JColorChooser(); colorDialog = JColorChooser.createDialog(null, "Planet Color", true, colorChooser, new ActionListener(){ public void actionPerformed(ActionEvent arg0) { stopCellEditing(); } }, new ActionListener(){ public void actionPerformed(ActionEvent arg0) { cancelCellEditing(); } } ); colorDialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ cancelCellEditing(); } }); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { colorChooser.setColor((Color)value); panel.setBackground((Color)value); panel.setBorder(new EtchedBorder()); return panel; } public Object getCellEditorValue() { return colorChooser.getColor(); } public boolean shouldSelectCell(EventObject anEvent){ colorDialog.setVisible(true); return true; } public void cancelCellEditing(){ colorDialog.setVisible(false); super.cancelCellEditing(); } public boolean stopCellEditing(){ colorDialog.setVisible(false); super.stopCellEditing(); return true; } private JColorChooser colorChooser; private JDialog colorDialog; private JPanel panel; } private static final int PLANET_COLUMN = 0; private static final int RADIUS_COLUMN = 1; private static final int MOONS_COLUMN = 2; private static final int GASEOUS_COLUMN = 3; private static final int COLOR_COLUMN = 4; private String[] columnNames = {"Planet", "Radius", "Moons", "Gaseous", "Color"}; private Object[][] cells = { {"Mercury", 2440.0, 0, false, Color.YELLOW}, {"Venus", 6052.0, 0, false, Color.YELLOW}, {"Earth", 6378.0, 1, false, Color.BLUE}, {"Mars", 3397.0, 2, false, Color.RED}, {"Jupiter", 71492.0, 16, true, Color.ORANGE}, {"Saturn", 60268.0, 18, true, Color.ORANGE}, {"Uranus", 25559.0, 17, true, Color.BLUE}, {"Nepture", 24766.0, 8, true, Color.BLUE} }; private static final int WIDTH = 400; private static final int HEIGHT = 300; }


    最新回复(0)