之前是搞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);
}
}
}
}