JTable表格的实现

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
简单表格

使用以下构造函数来创建一个简单表格: JTable(Object[][] rowData, Object[] columnNames);//以 一个默认表格模型来构建一个表格 参数: rowData--表格中的单元格数据 columnNames--列标题 构建表格数据: Object[][] cells={{“mercury”,new Double(2440),new Integer(0),Boolean.FALSE,Color.yellow},{“Venus”, new Double(6052),new Integer(0),Boolean.FALSE,Color.yellow},….} 该表格通过调用每个对象上的toString方法来显示该对象 构建表格的列标题: String[] columnNames={“Planet”,”Radius”,”Moons”}; 建立表格: JTable table=new JTable(cells, columnNames); 3 JScrollPane pane=new JScrollPane(table);

13
单元格的编辑 6-1

若要激活单元格的编辑功能,表格模型必须通过定义 isCellEditable方法,以便指明哪些单元格是可以编辑的。最 常见的情况是,你可以使某些列成为可编辑的列。 例如,下面的例子允许编辑4个列:


public boolean isCellEditable(int r, int c){ return c==NAME_COLUMN || c==MOON_COLUMN || c==GASEOUS_COLUMN || c==COLOR_COLUMN } private static final int NAME_COLUMN=0; private static final int MOON_COLUMN =2; private static final int GASEOUS_COLUMN =3; private static final int COLOR_COLUMN =4;
9
单元格的表示 3-1

在你的表格模型中定义下面这个方法:
Class getColumnClass(int columnIndex) 返回用于描述列类型的类,那么JTable类就会为该类 选择一个响应的绘制器。

JTable类在默认条件下提供的绘制器:
类型 ImageIcon Boolean Object 绘制为
16
单元格的编辑 6-4

如何安装单元格编辑器?我们必须把它们安装在一个特定的 列中 JTable类将表格列的有关信息存放在类型为TableColumn的 对象中。TableColumnModel类负责管理各个列。若要获得 某个特定的TableColumn对象,你必须获得列模型,以便让 它提供对象:
表格模型使用示例

程序代码详见PlanetTable.java,程序输出结果如下(注 意:在表格模型中,并不保存每个单元格的值,而只是提 供了一个计算单元格值的方法):
8
显示数据库记录示例

用表格显示sql server2000数据库中各个用户表 的记录。程序代码详见ResultSetTable.java,程 序输出结果如下:
图形
复选框 字符串
11
单元格的表示 3-2


对于其它类型,你可以提供自己的单元格绘制器--实现 TableCellRenderer接口,该接口只有一个方法: Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 当表格想要绘制一个单元格时,该方法便被调用。它返回一 个组件,该组件的paint方法将被调用 例如,若要显示一个类型为Color的单元格,你只需要返回一 个画面,其背景色设置为想要显示的颜色: class ColorTableCellRenderer implements TableCellRenderer{ private Jpanel = new JPanel(); public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){ panel. setBackground((Color)value); 12 return panel;

安装单元格编辑器:

17
单元格的编辑 6-5

默认情况下,表格的所有行都具有相同的高 度。可用下面的方法来设置各个行的高度:

table. setRowHeight(row, height); table. setRowMargin(margin);

设置行边距:

18
单元格的编辑 6-6
如何定制单元格编辑器? 1. 写一个类继承AbstractCellEditor类,并且实现 TableCellEditor接口 2. 定义getTableCellEditorComponent方法,返回一个组件用 来绘制单元格。这个组件可以是文本框、组合框、对话框等 等 3. 定义shouldSelectCell、stopCellEditing和cancelCellEditing 方法,用于编辑操作的启动、完成和取消。stopCellEditing 和cancelCellEditing方法应该调用超类方法,以确保监听器 能够得到这些操作的通知 4. 定义getCellEditorValue方法,返回作为编辑结果的值
19
单元格显示和编辑示例

程序代码详见TableCellRendererTest.java,程序输 出结果如下:
ห้องสมุดไป่ตู้
20
对行和列进行操作

改变列的大小--使用TableColumn类的下列 方法:



void setPreferredWidth(int width)//设置列的首选 宽度 void setMinWidth(int width) void setMaxWidth(int width) void setResizable(boolean resizable)//设置用户能 否改变列的大小 void setWidth(int width)//设置列的实际宽度 void setAutoResizableMode(int mode)
15
单元格的编辑 6-3

若要得到组合框编辑器,可参考以下示例: JComboBox moonCombo= new JComboBox(); for (int i=0;i<=20;i++) moonCombo. addItem(new Integer(i)); TableCellEditor moonEditor=new DefaultCellEditor(moonCombo);
表格模型 3-2

在我们的例子中,getValueAt方法用于计算相应的 值,并且对该值进行格式化:
public Object getValueAt(int r, int c){ double rate=(c+minRate)/100.0; int nperiods=r; double futureBalance=INITIAL_BALANCE*Math.pow(1+rate , nperiods) ; return NumberFormat.getCurrencyInstance().format(future Balance); }

TableColumnModel cm=table. getColumnModel; TableColumn mooncolumn=cm. getColumn(PlanetTableModel.MOON_COLUMN); Mooncolumn. setCellEditor(moonEditor);

注意:AbstractTableModel定义的isCellEditable方法总是返 回false,DefaultTableModel覆盖了该方法,总是返回true
14
单元格的编辑 6-2


DefaultCellEditor类可以用JTextField、 JCheckBox或者JComboBox来建立默认的单元格 编辑器。JTable类能够自动为boolean单元格安装 一个复选框编辑器,并且为没有提供它们自己的 绘制器的所有可编辑单元格提供一个文本编辑器 当编辑操作完成时,单元格编辑器通过调用表格 模型的setValueAt方法,将结果传递给表格模型 。你必须定义你的表格模型的setValueAt方法, 以便将编辑的结果转换成相应的值
单元格的表示 3-3

当你定义完单元格绘制器后,你必须告诉表格 对所有类型为Color的对象使用这个绘制器。使 用JTable类的setDefaultRenderer方法可以做到 这一点: Table. setDefaultRenderer(Color.class, new ColorTableCellRenderer); 如果你的单元格绘制器只是绘制字符串或者图 标,那么你可以扩展DefaultTableCellRenderer 类。
课题十一:JTable表格的实现
表格

JTable组件用于显示一个二维对象表格 与树一样, JTable并不存储它自己的数据,而是从表格模型 那里获取它的数据 构造函数: JTable() JTable(TableModel dm) JTable(TableModel dm, TableColumnModel cm) JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) JTable(int numRows, int numColumns) JTable(Vector rowData, Vector columnNames) JTable(Object[][] rowData, Object[] columnNames)
6
表格模型 3-3


getRowCount和getColumnCount方法只是返回行和列的数 量: public int getRowCount(){ return years; } public int getColumnCount(){ return maxRate-minRate+1; } 如果你不提供列的名字,那么AbstractTableModel类的 getColumnName方法便将各个列命名为A、B、C等等。若 要提供自己的列名,就要覆盖该方法: Public String getColumnName(int c){ double rate=(c+minRate)/100.0; return NumberFormat.getPercentInstance().format(rate); 7 }
简单表格示例

程序代码详见PlanetTable.java,程序输出结果 如下:
4
表格模型 3-1



在前面的例子中,表格的数据被存放在一个二维数组中。但 在实际编码中,一般不使用这种方法。你应该考虑实现你自 己的表格模型。 表格模型实现起来特别简单,你只需要继承 AbstractTableModel类,然后只需提供下面3个方法的实现 即可: public int getRowCount();//获取表格模型中行的数量 public int getColumnCount();//获取表格模型中列的数 量 public Object getValueAt(int row, int column);//获取 指定行列的单元格的值 在下面的例子中,我们使用表格模型来构建一个表格。它只 是显示一些计算得出的值,即不同利率条件下的投资增长额 5 。
相关文档
最新文档