高階Swing介面JTable程式設計
1.TableModel與JTable的關係:
TableModel它是一個介面,
javax.swing.JTable table=new javax.swing.JTable();
table.setModel(new 實現了TableModel介面的類);
首先,我們編寫一個TableModel的實現類如下:
import javax.swing.event.TableModelListener;
/**自定義的tableModel實現類*/
public class MyTableModelV1 implementsjavax.swing.table.TableModel{
//
public int getRowCount(){
return 10;
}
//多少列
public int getColumnCount(){
return 5;
}
//取得列名
public String getColumnName(int columnIndex){
return " 第"+columnIndex+"列名";
}
//每一列的資料型別:我們這裡顯示的都是String型
public Class<?>getColumnClass(int
return String.class;
}
//指定的單元格是否可從介面上編輯
public boolean isCellEditable(int rowIndex, int columnIndex){
if(columnIndex==0){
return false;
}
return true;
}
//取得指定單元格的值
public Object getValueAt(int rowIndex,
int
return rowIndex+"--"+columnIndex;
}
//從表格介面上改變了某個單元格的值後會呼叫這個方法
public void setValueAt(Object aValue, int rowIndex, int columnIndex){
String s="Change at: "+rowIndex+"--- "+columnIndex+" newValue: "+aValue;
System.out.println(s);
}
//這兩個介面方法暫無用
public void addTableModelListener(TableModelListenerl){}
public voidremoveTableModelListener(TableModelListener l){}
}
用以顯示這個Model的Jtable和介面程式碼如下://TableModel應用測試
public class TestJTable {
//程式入口
public static void main(String[] args) {
javax.swing.JFrame jf=new javax.swing.JFrame("表格測試");
jf.setSize(300,400);
java.awt.FlowLayout fl=new java.awt.FlowLayout();
jf.setLayout(fl);
//1.建立一個預設的簡單表格對像:
javax.swing.JTable table=new javax.swing.JTable();
//2.建立我們自定義的TableModel物件
MyTableModelV1 tm=new MyTableModelV1();
//3.將其設定為Table的Model
table.setModel(tm);
jf.add(table);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
}
}3.使用JTable+TableModel展示java中的資料物件:
首先,我們需要編寫自己的TableModel類,即實現了JtableModel介面的類,這個實現類使用裝有UserInfo的List物件,負責將列表中的使用者物件資訊提供給Jtable物件顯示:
import java.util.List;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
/**
* 用以在JTable中顯示UserInfo物件的TableModel實現類
* @author: 藍傑
*/
public class UserInfoTableModel implements TableModel{
privateList<UserInfo> userList; //要顯示的UserInfo物件列表
//建立模型物件時,必須傳入要顯示的UserInfo物件列表
public UserInfoTableModel(List<UserInfo> userList){
this.userList=userList;
}
//得到行數:列表中有幾個UserInfo物件,就顯示幾行
public int getRowCount(){
return userList.size();
}
//得到列數,UserInfo物件的每個屬性是一列,id,name,age,共3列
public int getColumnCount(){
return 3;
}
//指定某列的型別:暫時都是字串型別,
public Class<?> getColumnClass(int columnIndex){
return String.class;
}
//得到指定單元格的值:第幾行,就是列表中的第幾個UserInfo物件
public Object getValueAt(int rowIndex, int columnIndex){
// 第幾行,就是列表中的第幾個UserInfo物件
UserInfo user=userList.get(rowIndex);
if(columnIndex==0){//第一列是UserInfo物件的id值
return ""+user.getId();
}else if(columnIndex==1){//第二列是name屬性值
return user.getName();
}else if(columnIndex==2){//第二列是age值
return ""+user.getAge();
}else{//除非設計時邏輯錯誤,否則不會到這裡
return "出錯!";
}
}
//介面資料有變化時,模型物件的這個方法會被呼叫,暫時彈出說明框
public void setValueAt(Object aValue, int rowIndex, int columnIndex){
Stringinfo=rowIndex+"行"+columnIndex+"列的值改變: "+aValue.toString();
javax.swing.JOptionPane.showMessageDialog(null,info);
}
//指定某單元格是否可編輯:第一列不可編緝,第一列是ID,是每個物件的唯一識別號
public boolean isCellEditable(int rowIndex, int columnIndex){
if(columnIndex!=0){
return true;
}
return false;
}
//取每一列的列名
public String getColumnName(intcolumnIndex){
if(columnIndex==0){//第一列是UserInfo物件的id值
return "序號";
}else if(columnIndex==1){//第二列是name屬性值return "姓名";
}else if(columnIndex==2){//第二列是age值
return "年令";
}else{//除非設計時邏輯錯誤,否則不會到這裡
return "出錯!";
}
}
//新增和移除監聽器的方法暫不用,寫為空的
public void addTableModelListener(TableModelListenerl){}
public void removeTableModelListener(TableModelListenerl){}
} 接下來,我們建立介面和JTable物件,使用我們新編寫的UserInfoTableModel物件顯示使用者資料。
/**
* JTable和TableModel使用示例 v1
* @author: 藍傑
*/
public class UserTableUIV1 {
//程式入口
public static void main(String[] args) {
UserTableUIV1 lu=new UserTableUIV1();
lu.setupUI();
}
//顯示主介面
public void setupUI(){
javax.swing.JFramejf=new javax.swing.JFrame("JTable-TableModel示例");
jf.setSize(300,200);
java.awt.FlowLayout fl=new java.awt.FlowLayout();
jf.setLayout(fl);
//建立一個表格物件
final javax.swing.JTabletable=new javax.swing.JTable();
//得到要顯示的使用者列表物件:
List<UserInfo>userList=getUserList();
//建立我們實現的TableModel物件,建立時要傳入使用者列表物件
UserInfoTableModel tm=new UserInfoTableModel(userList);
table.setModel(tm);//將模型設給表格
jf.add(table);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
}
//模擬生成使用者物件列表
private List<UserInfo> getUserList(){
List<UserInfo> uList=new ArrayList();
for(int i=0;i<100;i++){
UserInfo user=new UserInfo();
user.setId(i+1);
user.setAge(20+i);
user.setName("使用者"+i);
uList.add(user);
}
return uList;
}
}1.設定表格的寬度和高度:
如下程式碼示例:
//設每一列的寬度
for(int i=0;i<table.getColumnCount();i++){
table.getColumnModel().getColumn(i).setPreferredWidth(40);
}
table.setRowHeight(20);//設定每一列的高度2.要顯示錶頭:
要將Jtable放到滾動板(javax.swing.JscrollPane)上,並設定其大小:
效果圖如下:
//將表格物件放到滾動面板物件上
javax.swing.JScrollPane scrollPane = new JScrollPane(table);
//設定表格在面板上的大小
table.setPreferredScrollableViewportSize(new Dimension(200, 70));
//超出大小後,JScrollPane自動出現滾動條
scrollPane.setAutoscrolls(true);
jf.add(scrollPane);//將scrollPane物件加到介面上3.新加列,將列設為下拉框:
程式碼示例:
4.表格排序:
排序要實現的功能是,當單擊表頭時,所在列會自動排序,程式碼段如下:
RowSorter<javax.swing.table.TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); table.setRowSorter(sorter); |
JTable事件響應是非常簡單,如下程式碼片斷所示,我們可以給表格加上一個滑鼠事件監聽器,當滑鼠單擊表格(上的某一個單元格)時,彈出單元格所在的行表和單元格中的值:
//給table加上一個滑鼠事件監聽器物件 table.addMouseListener(new java.awt.event.MouseAdapter(){ public void mouseClicked(MouseEvent e) {//僅當滑鼠單擊時響應 //得到選中的行列的索引值 int r= table.getSelectedRow(); int c= table.getSelectedColumn(); //得到選中的單元格的值,表格中都是字串 Object value= table.getValueAt(r, c); String info=r+"行"+c+"列值 : "+value.toString(); javax.swing.JOptionPane.showMessageDialog(null,info); } }); |
效果如下圖示:
表格某個單元格的值被編輯後,當焦點移出時,表格會自動呼叫自己的模型的setValueAt方法,傳入改變後的值和行列索引,這個功能也可被利用來做事件響應。
JTable和JTree是Swing介面應用中兩種常用的高階元件,如果我們能將JTree和JTable的應用組合起來,完善我們的《日誌管理系統》,使用JTree導航,使用JTable展示資料,如下圖示: