Java圖形化:Swing表格的使用

利用JTable類直接建立表格

建立表格:

在JTable類中除了默認的構造方法以外,還提供了利用指定表格列名數組和表格數據數組建立表格的構造方法,以下:java

JTable(Object[][] rowData,Object[] columnNames)數組

  • rowData就是表格的數據數組
  • columnNames就是表格的列名數組。

使用表格時,通常將其添加到滾動面板中,而後將滾動面板加到相應的位置。ide

在JTable中還提供了利用指定表格的列名向量和表格數據向量創造表格的構造方法,以下: JTable(Vector rowData,Vector columnNames)佈局

  • rowDara就是表格的數據向量
  • columnNames就是表格的列名向量

在使用表格時,有時候不須要使用滾動條,就能夠在窗體中顯示整個表格,在這種狀況下,也能夠直接將表格添加到相應的容器中。ui

注意:若是是將表格添加到相應的容器中,則須要經過JTable類的getTableHeader()方法得到JTableHeader類的對象,而後再將該對象添加到容器的相應位置,不然表格將沒有列名。spa

簡單表格案例:code

package view.flight;

import javax.swing.*;
import java.awt.*;

/** * @author: 個人襪子都是洞 */
public class TestGui extends JFrame {
    // 列名
    String[] columnName = new String[]{"航班號", "出發時間", "飛行時間", "出發地", "目的地", "餘票", "票價"};
    // 表格具體數據
    String[][] columnDate = new String[][]{
            {"1", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "50", "500.0"},
            {"2", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"3", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"4", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "40", "500.0"},
    };
    JTable table = new JTable(columnDate, columnName);

    TestGui(String title) {
        super(title);
        init();
        setComponent ();
        addComponent();
        addListener();
        setVisible(true);
    }
    private void init () {
        setSize(600, 400);
        // 設置窗口位置居中
        setLocationRelativeTo(null);
        // 設置佈局
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void setComponent () {
        // 設置第一列寬度爲40
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        // 設置第二列寬度爲120
        table.getColumnModel().getColumn(1).setPreferredWidth(120);
        
    }
    private void addComponent () {
        // 使用srcllpane會自動顯示列名
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
    }
    private void addListener () {

    }
    public static void main(String[] args) {
        new TestGui("JTable演示");
    }
}
複製代碼

JTable界面

定製表格

表格建立以後,還須要對其進行一系列的定義,以便適合於具體的使用狀況。默認狀況下雙擊單元格即可對其編輯,若是不須要此功能,能夠經過重構JTable類的isCellEditable(int row,int column)方法實現該方法返回boolean型值true,表示能夠編輯,不然返回false則表示不可編輯。cdn

可經過JTableHeader類的setReorderingAllowed(boolean reorderAllowed)方法設置表格是否支持從新排列功能,該方法返回boolean型值true表示支持,返回false表示不支持。對象

默認狀況下,單元格中的內容左側顯示,若是須要居中顯示,可經過重構JTable類的getDefaultRenderer(Class<?> columnClass)方法來實現。 重構的代碼:blog

public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
    DefaultTableCellRenderer cr=(DefaultTableCellRenderer)super.getDefaultRenderer(columnClass);
    cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
    return cr;
}
複製代碼

JTable類的用來定義表格的經常使用方法

  • setRowHeight(int rowHeight):設置表格的行高,默認像素爲16
  • setRowSelectionAllowed(boolean sa):設置是否容許選中表格行,默認爲容許選中,設爲false表示不容許選中
  • setSelectionMode(int sm):設置表格行的選中模式
  • setSelectionBackground(Color  cr):設置表格選中行的背景色
  • setSelectionForeground(Color  fc):設置表格選中行的前景色
  • setAutoResizeMode(int mode):設置表格的自動調整模式

在利用setSelectionMode(int sm)方法設置表格行的選擇模式時,它的入口參數從ListSelectionModel的靜態常量中選擇。以下:

  • 靜態常量:SINGLE_SELECTION,常量值:0,表示只選擇一個。
  • 靜態常量:SINGLE_INTERVAL_SELECTION,常量值:1,表示容許連續選擇多個
  • 靜態常量:MULTIPLE_INTERVAL_SELECTION,常量值:2,表示隨意選擇多個

在利用setAutoResizeMode(int mode)方法設置表格的自動調整模式時,它的入口參數從JTable類的靜態常量中選擇。

注意:表格的自動調整模式,就是在調整表格的某一列的寬度時,表格採用何種方式保持其總寬度不變。

操縱表格

在編寫應用程序時,常常須要得到表格的一些信息,以下是JTable類中的三個常常用來得到表格信息的方法。

  • getRowCount():得到表格擁有的行數,返回值爲int型。
  • getColumnCount():得到表格擁有的列數,返回值爲int型。
  • getColumnName(int column):得到位於指定索引位置的列的名稱,返回值爲String型。

JTable類中常常用來操縱表格選中行的方法以下:

  • setRowSelectionInterval(int from,int  to):選中行索引從from到to的全部行(包括索引爲from到to的行)
  • addRowSelectionInterval(int from,int to):將行索引從from到to的全部行追加爲表格的選中行
  • isRowSelected(int  row):查看行索引爲row的行是否被選中
  • selectAll():選中表格中的全部行
  • clearSelection():取消全部選中行的選擇狀態
  • getSelectedRowCount():獲得選中行的數量,返回值爲int型,若是沒有被選中的行,則返回-1
  • getSelectedRow():獲得被選中的行中最小的索引值,返回值爲int型,若是沒有被選中的行,則返回-1 -getSelectedRows():得到全部被選中行的索引值,返回值爲int數組

表格模型和表格

接口TableModel定義了一個表格模型,抽象類AbstracTableModel實現了TableModel接口的大部分方法,只有如下3個抽象方法沒有實現。

  • public int getRowCount()
  • public int getColumnCount()
  • public Object getValueAt(int rowIndex,int columnIndex)

經過繼承AbstractTableModel能夠實現上面的3個抽象方法能夠建立本身的表格模型類。DefaultTableModel類即是由Swing類提供的繼承了AbstractTableModel類並實現了上面3個抽象方法的表格模型類。

從JDK1.6開始,提供了對錶格進行排序的功能。經過JTable類的setRowSorter(RowSorter<? extends TableModel> sorter)方法能夠爲表格設置排序器。TableRowSorter類是由Swing提供的排序類,爲表格設置排序器的代碼以下:

DefaultTableModel tableModel=new DefaultTableModel();
JTable table=new JTable(tableModel);
table.setRowSorter(new TableRowSorter(tableModel));
複製代碼

在使用表格排序器時,一般須要爲其設置表格模型,一種方法是經過構造方法TableRowSorter(TableModel model),另外一種方法是經過setModel(TableModel  model)方法爲表格排序器設置表格模型。

維護表格模型

使用表格時,須要常常對錶格中的內容進行維護,如向表格中添加新的數據行、修改表格中某一單元格的值、從表格中刪除數據行等,這些操做均可以經過維護表格模型來完成。

在向表格模型中添加新的數據行時有兩種狀況:一種是添加到表格模型的尾部,另外一種是添加到表格模型指定的索引處,分別由addRow(Object[] rowData)insertRow(int row,Object[] rowData)addRow(Vector rowData)insertRow(int row,Vector rowData)方法實現。

若是須要修改表格模型中某一個單元格的數據,能夠經過方法setValueAt(Object aValue,int row,int column)完成,其中aValue就是修改後的值,能夠經過getValueAt(int row,int column)得到單元格的值,該方法返回Object型。

若是須要刪除表格模型中某一行的數據,能夠經過方法removeRow(int row)來完成,其中row爲欲要刪除行的索引。

使用TableModel模型案例:

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;

/** * @author: 個人襪子都是洞 */
public class TestGui extends JFrame {

    JTable table = new JTable(new FlightTableModel());

    TestGui(String title) {
        super(title);
        init();
        setComponent ();
        addComponent();
        addListener();
        setVisible(true);
    }
    private void init () {
        setSize(600, 400);
        // 設置窗口位置居中
        setLocationRelativeTo(null);
        // 設置佈局
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void setComponent () {
        // 設置第一列寬度爲40
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        // 設置第二列寬度爲120
        table.getColumnModel().getColumn(1).setPreferredWidth(120);

    }
    private void addComponent () {
        // 使用srcllpane會自動顯示列名
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
    }
    private void addListener () {

    }
    public static void main(String[] args) {
        new TestGui("JTable演示");
    }
}

class FlightTableModel extends AbstractTableModel {
    // 列名
    String[] columnName = new String[]{"航班號", "出發時間", "飛行時間", "出發地", "目的地", "餘票", "票價"};
    // 表格具體數據
    String[][] flightDate = new String[][]{
            {"1", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "50", "500.0"},
            {"2", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"3", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"4", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "40", "500.0"},
    };
    /** * 返回一共多少行 */
    @Override
    public int getRowCount() {
        return flightDate.length;
    }

    /** * 返回一共多少列 */
    @Override
    public int getColumnCount() {
        return columnName.length;
    }

    /** * 返回每個單元格的值 */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return flightDate[rowIndex][columnIndex];
    }

    /** * 獲取每一列的名稱 */
    @Override
    public String getColumnName(int column) {
        return columnName[column];
    }

    /** * 單元格是否能夠修改 */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}
複製代碼

效果:

使用TableModel的案例

經過監聽選中單元格獲取對應數據的實例:

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import java.awt.*;

/** * @author: 個人襪子都是洞 */
public class TestGui extends JFrame {
    FlightTableModel flight = new FlightTableModel();
    JTable table = new JTable(flight);

    TestGui(String title) {
        super(title);
        init();
        setComponent ();
        addComponent();
        addListener();
        setVisible(true);
    }
    private void init () {
        setSize(600, 400);
        // 設置窗口位置居中
        setLocationRelativeTo(null);
        // 設置佈局
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void setComponent () {
        // 設置第一列寬度爲40
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        // 設置第二列寬度爲120
        table.getColumnModel().getColumn(1).setPreferredWidth(120);

    }
    private void addComponent () {
        // 使用srcllpane會自動顯示列名
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
    }
    private void addListener () {
        // selection監聽器監聽表格哪行被選中
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                // 被選中的行
                int row = table.getSelectedRow();
                String str = (String)flight.getValueAt(row,0);
                System.out.println("選中的行號是:"+row+",航班號是:"+str);
            }
        });
    }
    public static void main(String[] args) {
        new TestGui("JTable演示");
    }
}

class FlightTableModel extends AbstractTableModel {
    // 列名
    String[] columnName = new String[]{"航班號", "出發時間", "飛行時間", "出發地", "目的地", "餘票", "票價"};
    // 表格具體數據
    String[][] flightDate = new String[][]{
            {"1", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "50", "500.0"},
            {"2", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"3", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "10", "500.0"},
            {"4", "2019-01-18 10:05", "90分鐘", "北京", "紐約", "40", "500.0"},
    };
    /** * 返回一共多少行 */
    @Override
    public int getRowCount() {
        return flightDate.length;
    }

    /** * 返回一共多少列 */
    @Override
    public int getColumnCount() {
        return columnName.length;
    }

    /** * 返回每個單元格的值 */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return flightDate[rowIndex][columnIndex];
    }

    /** * 獲取每一列的名稱 */
    @Override
    public String getColumnName(int column) {
        return columnName[column];
    }

    /** * 單元格是否能夠修改 */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}
複製代碼

關鍵部分:

// selection監聽器監聽表格哪行被選中
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                // 被選中的行
                int row = table.getSelectedRow();
                String str = (String)flight.getValueAt(row,0);
                System.out.println("選中的行號是:"+row+",航班號是:"+str);
            }
        });
複製代碼

獲取到的結果圖: 窗口圖:

窗口

數據:

數據
相關文章
相關標籤/搜索