JAVA學習之JTable(表格)

       之前是搞c語言的,對於java的圖形化編程是很不適應,學習了一點表格,但是好像還是雲裏霧裏,可能需要記憶的東西,經驗的東西比較多,自己只是學習也沒有應用過。感覺也沒什麼好寫的,但是還是要堅持寫一點記錄下簡單的知識,方便以後查閱。

1、JFrame、JScrollPane、JTable創建表格

對於圖形化,一個圖表首先要在一個可視化的窗口中,對於java就是JFrame

import java.awt.*;

import javax.swing.*;
public class ExampleFrame_01 extends JFrame {
	public static void main(String args[]) {
		ExampleFrame_01 frame = new ExampleFrame_01();
		frame.setVisible(true);
	}
	
	public ExampleFrame_01() {
		super();
		setTitle("創建可以滾動的表格");
		setBounds(100, 100, 240, 150);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        .....................//此處爲表格的實現
	}
}

從上面的代碼可以看到JFrame的用法,自己建了一個類ExampleFrame_01繼承了JFrame,程序運行從main函數開始

main函數中實例化了一個frame,然後設置frame爲可見。

實例化ExampleFrame_01會執行,ExampleFrame_01的重構函數,即ExampleFrame_01();

在這個函數裏面super();爲調用父類即JFrame的構造函數,一般子類的構造函數都要執行下父類的構造函數。

setTitle設置窗口的名字,setBounds設置窗口的邊界,setDefaultCloseOperation設置窗口的關閉方式。

 

有了窗口,下面先創建一個圖表,圖表分爲列名和表格裏面的內容,就是一個一維數組和一個二維數組組成。

        String[] columnNames = { "A", "B" }; // 定義表格列名數組
        String[][] tableValues = { { "A1", "B1" }, { "A2", "B2" },{ "A3", "B3" }, { "A4", "B4" }, { "A5", "B5" } }; // 定義表格數據數組
        JTable table = new JTable(tableValues, columnNames);// 創建指定列名和數據的表格

上面是直接用數組進行創建,數組也可以Vector來創建。

 

窗口介紹完了,一般一個表格大小不固定,可能比窗口大,所以表格一般都在一個JScrollPane滾動面板裏面。

        JScrollPane scrollPane = new JScrollPane(table);

上面語句的意思是定義一個JScrollPane 裏面有一個table。還有另外一種實現爲:

        final JScrollPane scrollPane = new JScrollPane();

        scrollPane.setViewportView(table);

面板創建好了,要規定下在窗口中的位置,例如在中間

        getContentPane().add(scrollPane, BorderLayout.CENTER);

以上代碼如下:

		String[] columnNames = { "A", "B" }; // 定義表格列名數組
		// 定義表格數據數組
		String[][] tableValues = { { "A1", "B1" }, { "A2", "B2" },
				{ "A3", "B3" }, { "A4", "B4" }, { "A5", "B5" } };
		// 創建指定列名和數據的表格
		JTable table = new JTable(tableValues, columnNames);
		// 創建顯示錶格的滾動面板
		JScrollPane scrollPane = new JScrollPane(table);
		// 將滾動面板添加到邊界佈局的中間
		getContentPane().add(scrollPane, BorderLayout.CENTER);

運行的效果如下:

 2、Jtable常用方法

        // 關閉表格列的自動調整功能
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        // 選擇模式爲單選
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // 被選擇行的背景色爲黃色
        table.setSelectionBackground(Color.YELLOW);
        // 被選擇行的前景色(文字顏色)爲紅色
        table.setSelectionForeground(Color.RED);
        table.setRowHeight(30); // 表格的行高爲30像素

table.selectAll();// 選中所有行

table.clearSelection();// 取消所有選中行的選擇狀態

table.getRowCount()//獲取行數

table.getSelectedRowCount() //獲取選擇的行數

table.getColumnName(1)//第2列的名稱

table.getValueAt(1, 1)//第2行第2列的值

 tableModel.setValueAt(aTextField.getText(),
selectedRow, 0);// 修改表格模型當中的指定值

table.isRowSelected(2)//第3行的選擇狀態

tableModel.addRow(rowValues);// 向表格模型中添加一行
 tableModel.removeRow(selectedRow);// 從表格模型當中刪除指定行

可以自己下載一個java的API文檔,查看各個函數的用法,例如:

 3、一種特殊的表格:固定一列的表格MFixedColumnTable

如上圖,固定日期一列,然後下面的水平滾動條進行滾動,日期這一列不變。

    // 創建固定列表格模型對象
    fixedColumnTableModel = new FixedColumnTableModel();

    // 將固定列表格頭放到滾動面版的左上方
    scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
            fixedColumnTable.getTableHeader());
    // 創建一個用來顯示基礎信息的視口對象
    JViewport viewport = new JViewport();
    viewport.setView(fixedColumnTable);// 將固定列表格添加到視口中
    // 設置視口的首選大小爲固定列表格的首選大小
    viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
    // 將視口添加到滾動面版的標題視口中
    scrollPane.setRowHeaderView(viewport);

------------下面定義非固定列-----------

    // 創建可移動列表格模型對象
    floatingColumnTableModel = new FloatingColumnTableModel();
    // 創建可移動列表格對象
    floatingColumnTable = new JTable(floatingColumnTableModel);
    // 將可移動表格添加到默認視口
    scrollPane.setViewportView(floatingColumnTable);
    add(scrollPane, BorderLayout.CENTER);

ExampleFrame_07.java

import java.awt.*;
import java.util.*;

import javax.swing.*;

public class ExampleFrame_07 extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String args[]) {
		try {
			ExampleFrame_07 frame = new ExampleFrame_07();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ExampleFrame_07() {
		super();
		setTitle("提供行標題欄的表格");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Vector<String> columnNameV = new Vector<>();
		columnNameV.add("日期");
		for (int i = 1; i < 21; i++) {
			columnNameV.add("商品" + i);
		}
		Vector<Vector<Object>> tableValueV = new Vector<>();
		for (int row = 1; row < 31; row++) {
			Vector<Object> rowV = new Vector<>();
			rowV.add(row);
			for (int col = 0; col < 20; col++) {
				rowV.add((int) (Math.random() * 1000));
			}
			tableValueV.add(rowV);
		}
		final MFixedColumnTable panel = new MFixedColumnTable(columnNameV,
				tableValueV, 1);
		getContentPane().add(panel, BorderLayout.CENTER);
		//
	}
	
}

 MFixedColumnTable.java

import java.awt.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class MFixedColumnTable extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTable fixedColumnTable;// 固定列表格對象
	private FixedColumnTableModel fixedColumnTableModel;// 固定列表格模型對象
	private JTable floatingColumnTable;// 移動列表格對象
	// 移動列表格模型對象
	private FloatingColumnTableModel floatingColumnTableModel;
	private Vector<String> columnNameV;// 表格列名數組
	private Vector<Vector<Object>> tableValueV;// 表格數據數組
	private int fixedColumn = 1;// 固定列數量
	
public MFixedColumnTable(Vector<String> columnNameV,
		Vector<Vector<Object>> tableValueV, int fixedColumn) {
	super();
	setLayout(new BorderLayout());
	this.columnNameV = columnNameV;
	this.tableValueV = tableValueV;
	this.fixedColumn = fixedColumn;
	// 創建固定列表格模型對象
	fixedColumnTableModel = new FixedColumnTableModel();
	// 創建固定列表格對象
	fixedColumnTable = new JTable(fixedColumnTableModel);
	// 獲得選擇模型對象
	ListSelectionModel fixed = fixedColumnTable.getSelectionModel();
	// 選擇模式爲單選
	fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	// 添加行被選中的事件監聽器
	fixed.addListSelectionListener(new MListSelectionListener(true));
	// 創建可移動列表格模型對象
	floatingColumnTableModel = new FloatingColumnTableModel();
	// 創建可移動列表格對象
	floatingColumnTable = new JTable(floatingColumnTableModel);
	// 關閉表格的自動調整功能
	floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	ListSelectionModel floating = floatingColumnTable
			.getSelectionModel();// 獲得選擇模型對象
	// 選擇模式爲單選
	floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	// 添加行被選中的事件監聽器
	MListSelectionListener listener = new MListSelectionListener(false);
	floating.addListSelectionListener(listener);
	JScrollPane scrollPane = new JScrollPane();// 創建一個滾動面版對象
	// 將固定列表格頭放到滾動面版的左上方
	scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
			fixedColumnTable.getTableHeader());
	// 創建一個用來顯示基礎信息的視口對象
	JViewport viewport = new JViewport();
	viewport.setView(fixedColumnTable);// 將固定列表格添加到視口中
	// 設置視口的首選大小爲固定列表格的首選大小
	viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
	// 將視口添加到滾動面版的標題視口中
	scrollPane.setRowHeaderView(viewport);
	// 將可移動表格添加到默認視口
	scrollPane.setViewportView(floatingColumnTable);
	add(scrollPane, BorderLayout.CENTER);
}
	
	private class FixedColumnTableModel extends AbstractTableModel {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public int getColumnCount() {// 返回固定列的數量
			return fixedColumn;
		}
		
		public int getRowCount() {// 返回行數
			return tableValueV.size();
		}
		
		// 返回指定單元格的值
		public Object getValueAt(int rowIndex, int columnIndex) {
			return tableValueV.get(rowIndex).get(columnIndex);
		}
		
		@Override
		public String getColumnName(int columnIndex) {// 返回指定列的名稱
			return columnNameV.get(columnIndex);
		}
	}
	
	private class FloatingColumnTableModel extends AbstractTableModel {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public int getColumnCount() {// 返回可移動列的數量
			return columnNameV.size() - fixedColumn;// 需要扣除固定列的數量
		}
		
		public int getRowCount() {// 返回行數
			return tableValueV.size();
		}
		
		// 返回指定單元格的值
		public Object getValueAt(int rowIndex, int columnIndex) {
			// 需要爲列索引加上固定列的數量
			return tableValueV.get(rowIndex)
					.get(columnIndex + fixedColumn);
		}
		
		@Override
		public String getColumnName(int columnIndex) {// 返回指定列的名稱
			// 需要爲列索引加上固定列的數量
			return columnNameV.get(columnIndex + fixedColumn);
		}
	}
	
	private class MListSelectionListener implements ListSelectionListener {
		boolean isFixedColumnTable = true; // 默認由選中固定列表格中的行觸發
		
		public MListSelectionListener(boolean isFixedColumnTable) {
			this.isFixedColumnTable = isFixedColumnTable;
		}
		
		public void valueChanged(ListSelectionEvent e) {
			if (isFixedColumnTable) { // 由選中固定列表格中的行觸發
				// 獲得固定列表格中的選中行
				int row = fixedColumnTable.getSelectedRow();
				// 同時選中右側可移動列表格中的相應行
				floatingColumnTable.setRowSelectionInterval(row, row);
			} else { // 由選中可移動列表格中的行觸發
				// 獲得可移動列表格中的選中行
				int row = floatingColumnTable.getSelectedRow();
				// 同時選中左側固定列表格中的相應行
				fixedColumnTable.setRowSelectionInterval(row, row);
			}
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章