C語言中文網 目錄
首頁 > Java Swing 閱讀:1,724

Java Swing JTable:表格

< 上一頁Swing對話框 Swing樹下一頁 >

表格是 Swing 新增加的組件,主要功能是把數據以二維表格的形式顯示出來,并且允許用戶對表格中的數據進行編輯。表格組件是最復雜的組件之一,它的表格模型功能非常強大、靈活而易于執行。由于篇幅有限,本節只介紹默認的表格模型。

Swing 使用 JTable 類實現表格,常用構造方法如下所示。
  • JTable():構造一個默認的 JTable,使用默認的數據模型、默認的列模型和默認的選擇模型對其進行初始化。
  • JTable(int numRows,int numColumns):使用 DefaultTableModel 構造具有 numRows 行和 numColumns 列個空單元格的 JTable。
  • JTable(Object[][] rowData,Object[] columnNames):構造一個 JTable 來顯示二 維數組 rowData 中的值,其列名稱為 columnNames。

創建一個帶有滾動條的 JTable 對象非常簡單,如下所示。
JTable table=new JTable(5,6);
JScrollPane pane=new JScrollPane(table);

第一條語句創建了一個 JTable 對象。第二條語句創建了一個存放 JTable 對象的 JScrollPane 對象,該對象是一個視圖對象。JScrollPane是一個垂直和水平滾動條,以及可設置行和列標題的容器。上面兩行代碼執行后的表格效果如圖1 所示。

表格
圖1 表格

表格有很多的選項設置,因此 JTable 類常用方法也很多,這些常用方法如表 1 所示。

表1 JTable類的常用方法
方法名稱 說明
getColumnCount() 返回列模型中的列數
getColumnN ame(int column) 返回出現在視圖中 column 列位置處的列名稱
getRowCount() 返回 JTable 中可以顯示的行數(給定無限空間)
getRowSorter() 返回負責排序的對象
getSelectedColumn() 返回第一個選定列的索引,如果沒有選定的列, 則返回 -1
getSelectedRow() 返回第一個選定行的索引,如果沒有選定的行, 則返回 -1
getValueAt(int row,int column) 返回 row 和 column 位置的單元格值
isEditing() 如果正在編輯單元格,則返回 true
selectAll() 選擇表中的所有行、列和單元格
setColumnSelectionInterval(int index0,int index1) 選擇從 index0 到 index1之間(包含兩端)的列
setRowSelectionInterval(int index0,int index1) 選擇從 index0 到 index1 之間(包含兩端)的行
setTableHeader(JTableHeader tableHeader) 將此 JTable 所使用的 tableHeader 設置為 newHeader
setUpdateSelectionOnSort(boolean update) 指定排序后是否應該更新選擇
setValueAt(Object a Value,int row,int column) 設置表模型中 row 和 column 位置的單元格值

例 1

使用 JTable 類創建一個包含 8 列的學生成績表,并向表格中填充幾行數據,具體實現代碼如下所示。
package ch18;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class JTableDemo
{
    public static void main(String[] agrs)
    {
        JFrame frame=new JFrame("學生成績表");
        frame.setSize(500,200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane=frame.getContentPane();
        Object[][] tableDate=new Object[5][8];
        for(int i=0;i<5;i++)
        {
            tableDate[i][0]="1000"+i;
            for(int j=1;j<8;j++)
            {
                tableDate[i][j]=0;
            }
        }
        String[] name={"學號","軟件工程","Java","網絡","數據結構","數據庫","總成績","平均成績"};
        JTable table=new JTable(tableDate,name);
        contentPane.add(new JScrollPane(table));
        frame.setVisible(true);
    }
}

如上述代碼所示,表格組件和其他組件類似,可以方便地創建一個 JTable 對象。 如果 JTbale 對象直接添加到 JFrame 中,則表頭顯示不出來,需要把表格對象放入 JScrollPane 對象中,之后把 JScrollPane 對象添加到 JFrame 中。實例的運行效果如圖 2 所示。

學生成績表運行效果
圖2 學生成績表運行效果

例 2

Swing 中表格的數據可以根據需求動態變化,比如對于表格中不需要的數據,可以將其刪除。本實例將演示如何從表格中刪除用戶選擇的行,實現過程如下。

(1) 創建一個繼承自 JFrame 的 RowDeleteDemo 類。
package ch18;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
public class RowDeleteDemo extends JFrame
{
    private JPanel contentPane;
    private JTable table;
    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        RowDeleteDemo frame = new RowDeleteDemo();
        frame.setVisible(true);
    }
    /**
     * Create the frame.
     */
}

(2) 在構造方法中增加表格,設置表格的數據模型,添加“刪除”按鈕并監聽單擊事件。實現代碼如下:
public RowDeleteDemo()
{
    addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowActivated(WindowEvent e)
        {
            do_this_windowActivated(e);
        }
    });
    setTitle("圖書信息表");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100,100,450,200);
    contentPane=new JPanel();
    contentPane.setBorder(new EmptyBorder(5,5,5,5));
    contentPane.setLayout(new BorderLayout(0,0));
    setContentPane(contentPane);
    JPanel panel=new JPanel();
    contentPane.add(panel,BorderLayout.SOUTH);
    JButton button=new JButton("刪除");
    button.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            do_button_actionPerformed(e);
        }
    });
    panel.add(button);
    JScrollPane scrollPane=new JScrollPane();
    contentPane.add(scrollPane,BorderLayout.CENTER);
    table=new JTable();
    table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    scrollPane.setViewportView(table);
}

(3) 監聽窗體激活事件,完成向表中增加數據的功能。這里使用了表格模型對象,它可以方便地處理表格中的數據。實現代碼如下:
protected void do_this_windowActivated(WindowEvent e)
{
    DefaultTableModel tableModel=(DefaultTableModel) table.getModel();    //獲得表格模型
    tableModel.setRowCount(0);    //清空表格中的數據
    tableModel.setColumnIdentifiers(new Object[]{"書名","出版社","出版時間","叢書類別","定價"});    //設置表頭
    tableModel.addRow(new Object[]{"Java從入門到精通(第2版)","清華大學出版社","2010-07-01","軟件工程師入門叢書","59.8元"});    //增加列
    tableModel.addRow(new Object[]{"PHP從入門到精通(第2版)","清華大學出版社","2010-07-01","軟件工程師入門叢書","69.8元"});
    tableModel.addRow(new Object[]{"Visual Basic從入門到精通(第2版)","清華大學出版社","2010-07-01","軟件工程師入門叢書","69.8元"});
    tableModel.addRow(new Object[]{"Visual C++從入門到精通(第2版)","清華大學出版社","2010-07-01","軟件工程師入門叢書","69.8元" });
    table.setRowHeight(30);
    table.setModel(tableModel);    //應用表格模型
}

(4) 監聽用戶單擊“刪除”按鈕事件,這里通過 do_button_actionPerformed() 方法完成。在該方法中,首先獲取表格模型,然后獲得用戶選擇的行,再執行刪除數據操作。實現代碼如下:
protected void do_button_actionPerformed(ActionEvent e)
{
    DefaultTableModel model=(DefaultTableModel) table.getModel();    //獲得表格模型
    int[] selectedRows=table.getSelectedRows();
    for(int i=selectedRows[0];i<selectedRows.length;i++)
    {
        model.removeRow(selectedRows[0]);
    }
    table.setModel(model);
}

(5) 運行程序,默認在表格中會顯示所有數據,如圖 3 所示。圖 4 所示為刪除兩行后的表格效果。

刪除前表格數據
圖3 刪除前表格數據

刪除后表格數據
圖4 刪除后表格數據
< 上一頁Swing對話框 Swing樹下一頁 >

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo