返回介绍

13.19.14 表格

发布于 2024-10-15 23:56:31 字数 2358 浏览 0 评论 0 收藏 0

和树状物一样,表格在 Swing 相当的庞大和强大。它们最初有意被设计成以 Java 数据库连结(JDBC,在 15 章有介绍)为媒介的“网格”数据库接口,并且因此它们拥有的巨大的灵活性,使我们不再感到复杂。无疑,这是足以成为成熟的电子数据表的基础条件而且可能为整本书提供很好的根据。但是,如果我们理解这个的基础条件,它同样可能创建相关的简单的 Jtable。

JTable 控制数据的显示方式,但 TableModel 控制它自己的数据。因此在我们创建 JTable 前,应先创建一个 TableModel。我们可以全部地执行 TableModel 接口,但它通常从 helper 类的 AbstractTableModel 处简单地继承:

//: Table.java
// Simple demonstration of JTable
package c13.swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

// The TableModel controls all the data:
class DataModel extends AbstractTableModel {
  Object[][] data = {
    {"one", "two", "three", "four"},
    {"five", "six", "seven", "eight"},
    {"nine", "ten", "eleven", "twelve"},
  };
  // Prints data when table changes:
  class TML implements TableModelListener {
    public void tableChanged(TableModelEvent e) {
      for(int i = 0; i < data.length; i++) {
        for(int j = 0; j < data[0].length; j++)
          System.out.print(data[i][j] + " ");
        System.out.println();
      }
    }
  }
  DataModel() {
    addTableModelListener(new TML());
  }
  public int getColumnCount() { 
    return data[0].length; 
  }
  public int getRowCount() { 
    return data.length;
  }
  public Object getValueAt(int row, int col) { 
    return data[row][col]; 
  }
  public void 
  setValueAt(Object val, int row, int col) {
    data[row][col] = val;
    // Indicate the change has happened:
    fireTableDataChanged();
  }
  public boolean 
  isCellEditable(int row, int col) { 
    return true; 
  }
};       

public class Table extends JPanel {
  public Table() {
    setLayout(new BorderLayout());
    JTable table = new JTable(new DataModel());
    JScrollPane scrollpane = 
      JTable.createScrollPaneForTable(table);
    add(scrollpane, BorderLayout.CENTER);
  }
  public static void main(String args[]) {
    Show.inFrame(new Table(),200,200);
  }
} ///:~

DateModel 包括一组数据,但我们同样能从其它的地方得到数据,例如从数据库中。构建器增加了一个 TableModelListener 用来在每次表格被改变后打印数组。剩下的方法都遵循 Bean 的命名规则,并且当 JTable 需要在 DateModel 中显示信息时调用。AbstractTableModel 提供了默认的 setValueAt() 和 isCellEditable() 方法以防止修改这些数据,因此如果我们想修改这些数据,就必须过载这些方法。

一旦我们拥有一个 TableModel,我们只需要将它分配给 JTable 构建器即可。所有有关显示,编辑和更新的详细资料将为我们处理。注意这个程序例子同样将 JTable 放置在 JScrollPane 中,这是因为 JScrollPane 需要一个特殊的 JTable 方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文