java jtable应用源码_JTable的应用(一)
類層次結(jié)構(gòu)圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JTabel
在使用JTable以前,我們先看一下它的構(gòu)造函數(shù)有哪些, 以及應(yīng)該如何使用:
JTabel構(gòu)造函數(shù):
JTable():建立一個新的JTables,并使用系統(tǒng)默認(rèn)的Model.
JTable(int numRows,int numColumns):建立一個具有numRows行,numColumns列的空表格,使用的是DefaultTableModel.
JTable(Object[][] rowData,Object[][] columnNames):建立一個顯示二維數(shù)組數(shù)據(jù)的表格,且可以顯示列的名稱。
JTable(TableModel dm):建立一個JTable,有默認(rèn)的字段模式以及選擇模式,并設(shè)置數(shù)據(jù)模式。
JTable(TableModel dm,TableColumnModel cm):建立一個JTable,設(shè)置數(shù)據(jù)模式與字段模式,并有默認(rèn)的選擇模式。
JTable(TableModel dm,TableColumnModel cm,ListSelectionModel sm):建立一個JTable,設(shè)置數(shù)據(jù)模式、字段模式、與選擇模式。
JTable(Vector rowData,Vector columnNames):建立一個以Vector為輸入來源的數(shù)據(jù)表格,可顯示行的名稱。
我們先以Array構(gòu)造方式,說明如何利用JTable來建立一個簡單的表格:
import?javax.swing.*;
import?java.awt.*;
import?java.awt.event.*;
import?java.util.*;
public?class?SimpleTable{
public?SimpleTable(){
JFrame?f=new?JFrame();
Object[][]?playerInfo={
{"阿呆",new?Integer(66),new?Integer(32),new?Integer(98),new?Boolean(false)},
{"阿呆",new?Integer(82),new?Integer(69),new?Integer(128),new?Boolean(true)},
};
String[]?Names={"姓名","語文","數(shù)學(xué)","總分","及格"};
JTable?table=new?JTable(playerInfo,Names);
table.setPreferredScrollableViewportSize(new?Dimension(550,30));
JScrollPane?scrollPane=new?JScrollPane(table);
f.getContentPane().add(scrollPane,BorderLayout.CENTER);
f.setTitle("Simple?Table");
f.pack();
f.show();
f.addWindowListener(new?WindowAdapter()?{
public?void?windowClosing(WindowEvent?e)?{
System.exit(0);
}
});
}
public?static?void?main(String[]?args){
SimpleTable?b=new?SimpleTable();
}
}
表格由兩部份組成:分別是行標(biāo)題(Column Header)與行對象(Column Object).利用JTable所提供的getTableHeader()方法取得行標(biāo)題。在這個例子中,我們將JTable放在 JScrollPane中,這種做法可以將Column Header與Colmn Object完整的顯示出來,因?yàn)镴ScrollPane會自動取得Column Header.但如果文壇讀者將上面第15行去掉并修改第16行:f.getContentPane().add(table,BorderLayout.CENTER); 則運(yùn)行結(jié)果你會發(fā)現(xiàn)Column Header不見了。
如果你不想用JScrollPane,要解決這個問題,你必須將程序修改如下:
JTable table=new JTable(p,n);
table.setPreferredScrollableViewportSize(new Dimension(550,30));
f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);
f.getContentPane().add(table,BorderLayout.CENTER);
運(yùn)行結(jié)果就會跟之前一樣有行標(biāo)題了.上面的運(yùn)行結(jié)果就會跟發(fā)現(xiàn),每個字段的寬度都是一樣的,除非你自行拉曳某個列寬。若我們想一開始就設(shè)置列寬的值,可以 利用TableColumn類所提供的setPreferredWidth()方法來設(shè)置,并可利用JTable類所提供的 setAutoResizeMode()方法來設(shè)置調(diào)整某個列寬時其他列寬的變化情況,我們看下面這個例子:
import?javax.swing.*;
import?javax.swing.table.*;
import?java.awt.*;
import?java.awt.event.*;
import?java.util.*;
public?class?SimpleTable2{
public?SimpleTable2(){
JFrame?f=new?JFrame();
Object[][]?p={
{"阿呆",new?Integer(66),new?Integer(32),new?Integer(98),new?Boolean(false),new?Boolean(false)},
{"阿呆",new?Integer(82),new?Integer(69),new?Integer(128),new?Boolean(true),new?Boolean(false)},
};
String[]?n={"姓名","語文","數(shù)學(xué)","總分","及格","作弊"};
TableColumn?column=null;
JTable?table=new?JTable(p,n);
table.setPreferredScrollableViewportSize(new?Dimension(550,30));
table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
//利用JTable中的getColumnModel()方法取得TableColumnModel對象;再利用TableColumnModel界面?所定義的getColumn()方法取TableColumn對象,利用此對象的setPreferredWidth()方法就可以控制字段的寬度.????for?(int?i=0;i<6;i++){
column=table.getColumnModel().getColumn(i);
if?((i%2)==0)?column.setPreferredWidth(150);
else?column.setPreferredWidth(50);
}
JScrollPane?scrollPane=new?JScrollPane(table);
f.getContentPane().add(scrollPane,BorderLayout.CENTER);
f.setTitle("Simple?Table");
f.pack();
f.show();
f.setVisible(true);
f.addWindowListener(new?WindowAdapter()?{
public?void?windowClosing(WindowEvent?e)?{
System.exit(0);
}
});
}
public?static?void?main(String[]?args){
new?SimpleTable2();
}
}
列可調(diào)整的5個參數(shù):
AUTO_RESIZE_SUBSEQUENT_COLUMENS:當(dāng)調(diào)整某一列寬時,此字段之后的所有字段列寬都會跟著一起變動。此為系統(tǒng)默認(rèn)值。
AUTO_RESIZE_ALL_COLUMNS:當(dāng)調(diào)整某一列寬時,此表格上所有字段的列寬都會跟著一起變動。
AUTO_RESIZE_OFF:當(dāng)調(diào)整某一列寬時,此表格上所有字段列寬都不會跟著改變。
AUTO_RESIZE_NEXT_COLUMN:當(dāng)調(diào)整某一列寬時,此字段的下一個字段的列寬會跟著改變,其余均不會變。
AUTO_RESIZE_LAST_COLUMN:當(dāng)調(diào)整某一列寬時,最后一個字段的列寬會跟著改變,其余均不會改變。
由以上范例可知,利用Swing來構(gòu)造一個表格其實(shí)很簡單的,只要你利用Vector或Array來作為我們表格的數(shù)據(jù)輸入,將Vector或Array 的內(nèi)容填入JTable中,一個基本的表格就產(chǎn)生了。不過,雖然利用JTable(Object[][] rowData,Object[][] columnNames)以及JTable(Vector rowData,Vector columnNames)構(gòu)造函數(shù)來構(gòu)造構(gòu)造JTable很方便,但卻有些缺點(diǎn)。例如上例中,我們表格中的每個字段(cell)一開始都是默認(rèn)為可修改 的,用戶因此可能修改到我們的數(shù)據(jù);其次,表格中每個單元(cell)中的數(shù)據(jù)類型將會被視為同一種。在我們的例子中,數(shù)據(jù)類型皆被顯示為String的 類型,因此,原來的數(shù)據(jù)類型聲明為Boolean的數(shù)據(jù)會以String的形式出現(xiàn)而不是以檢查框(Check Box)出現(xiàn)。除此之外,如果我們所要顯示的數(shù)據(jù)是不固定的,或是隨情況而變,例如同樣是一份成績單,老師與學(xué)生所看到的表格就不會一樣,顯示的外觀或操 作模式也許也不相同。為了因應(yīng)這些種種復(fù)雜情況,上面簡單的構(gòu)造方式已不宜使用,Swing提供各種Model(如:TableModel、 TableColumnModel與ListSelectionModel)來解決上述的不便,以增加我們設(shè)計(jì)表格的彈性。我們下面就先對 TableModel來做介紹:
8-2:TableModel
TableModel類本身是一個interface,在這個interface里面定義了若干的方法:包括了存取表格字段(cell)的內(nèi)容、計(jì)算表格 的列數(shù)等等的基本存取操作,讓設(shè)計(jì)者可以簡單地利用TableModel來實(shí)作他所想要的表格。TableModel界面是放在 javax.swing.table package中,這個package定義了許多JTable會用到的各種Model,讀者可利用java api文件找到這個package,并由此package找到各類或界面所定義的方法。
TableModel方法:
void addTableModelListener(TableModelListener l):使表格具有處理TableModelEvent的能力。當(dāng)表格的Table Model有所變化時,會發(fā)出TableModel Event事件信息.
Class getColumnClass(int columnIndex):返回字段數(shù)據(jù)類型的類名稱.
int getColumnCount():返回字段(行)數(shù)量.
String getColumnName(int columnIndex):返回字段名稱.
int getRowCount():返回?cái)?shù)據(jù)列數(shù)量.
Object getValueAt(int rowIndex,int columnIndex):返回?cái)?shù)據(jù)某個cell中的值.
boolean isCellEditable(int rowIndex,int columnIndex):返回cell是否可編輯,true的話為可編輯.
void removeTableModelListener(TableModelListener l):從TableModelListener中移除一個listener.
void setValueAt(Object aValue,int rowIndex,int columnIndex):設(shè)置某個cell(rowIndex,columnIndex)的值;
由于TableModel本身是一個Interface,因此若要直接實(shí)現(xiàn)此界面來建立表格并不是件輕松的事.幸好java提供了兩個類分別實(shí)現(xiàn)了 這個界面,一個是AbstractTableModel抽象類,一個是DefaultTableModel實(shí)體類.前者實(shí)現(xiàn)了大部份的 TableModel方法,讓用戶可以很有彈性地構(gòu)造自己的表格模式;后者繼承前者類,是java默認(rèn)的表格模式.這三者的關(guān)系如下所示:
TableModel---implements--->AbstractTableModel-----extends--->DefaultTableModel
8-3:AbstractTableModel:
java提供的AbstractTableModel是一個抽象類,這個類幫我們實(shí)現(xiàn)大部份的TableModel方法,除了 getRowCount(),getColumnCount(),getValueAt()這三個方法外.因此我們的主要任務(wù)就是去實(shí)現(xiàn)這三個方法.利用 這個抽象類就可以設(shè)計(jì)出不同格式的表格.我們來看看它所提供的方法.
AbstractTableModel方法:
void addTableModelListener(TableModelListener l):使表格具有處理TableModelEvent的能力.當(dāng)表格的Table Model有所變化時,會發(fā)出TableModelEvent事件信息. ? ? int ?findColumn(String columnName):尋找在行名稱中是否含有columnName這個項(xiàng)目.若有,則返回其所在行的位置;反之則返回-1表示未找到.
void fireTableCellUpdated(int row, int column):通知所有的Listener在這個表格中的(row,column)字段的內(nèi)容已經(jīng)改變了.
void fireTableChanged(TableModelEvent e):將所收的事件通知傳送給所有在這個table model中注冊過的TableModelListeners.
void fireTableDataChanged():通知所有的listener在這個表格中列的內(nèi)容已經(jīng)改變了.列的數(shù)目可能已經(jīng)改變了,因此JTable可能需要重新顯示此表格的結(jié)構(gòu).
void fireTableRowsDeleted(int firstRow, int lastRow):通知所有的listener在這個表格中第firstrow行至lastrow列已經(jīng)被刪除了.
void fireTableRowsUpdated(int firstRow, int lastRow):通知所有的listener在這個表格中第firstrow行至lastrow列已經(jīng)被修改了.
void fireTableRowsInserted(int firstRow, int lastRow):通知所有的listener在這個表格中第firstrow行至lastrow列已經(jīng)被加入了.
void fireTableStructureChanged():通知所有的listener在這個表格的結(jié)構(gòu)已經(jīng)改變了.行的數(shù)目,名稱以及數(shù)據(jù)類型都可能已經(jīng)改變了.
Class getColumnClass(int columnIndex):返回字段數(shù)據(jù)類型的類名稱.
String getColumnName(int column):若沒有設(shè)置列標(biāo)題則返回默認(rèn)值,依次為A,B,C,...Z,AA,AB,..;若無此column,則返回一個空的String.
Public EventListener[] getListeners(Class listenerType):返回所有在這個table model所建立的listener中符合listenerType的listener,并以數(shù)組形式返回.
boolean isCellEditable(int rowIndex, int columnIndex):返回所有在這個table model所建立的listener中符合listenerType形式的listener,并以數(shù)組形式返回.
void removeTableModelListener(TableModelListener l):從TableModelListener中移除一個listener.
void setValueAt(Object aValue, int rowIndex, int columnIndex):設(shè)置某個cell(rowIndex,columnIndex)的值.
若你仔細(xì)比較TableModel所定義的方法與上述AbstractTableModel所提供的方法,你可以發(fā) 現(xiàn),AbstractTableModel抽象類并沒有實(shí)現(xiàn)getRowCount(),getColumnCount(),getValueAt()這 三個方法,這也就是為什么我們要去實(shí)現(xiàn)這三個方法的原因.下面我們來看如何使用AbstractTableModel來實(shí)作出自己想要的表格模式.
范例:TableModel1.java
View Code import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TableModel1{
public TableModel1() {
JFrame f = new JFrame();
MyTable mt=new MyTable();
JTable t=new JTable(mt);
t.setPreferredScrollableViewportSize(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(s, BorderLayout.CENTER);
f.setTitle("JTable1");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new TableModel1();
}
}
class MyTable extends AbstractTableModel{
Object[][] p = {
{"阿呆", new Integer(66), new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
{"阿瓜", new Integer(85), new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},
};
String[] n = {"姓名", "語文","數(shù)學(xué)","總分","及格","作弊"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return p.length;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
return p[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
上例中表格內(nèi)的數(shù)據(jù)類型不論是String,int或是Boolean類型,都均以string的類型顯示.例如在及格的字段中,原本的數(shù)據(jù)是以 Boolean類型來表示,但顯示在JTable上時便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
這樣"作弊"會以Check Box顯示,數(shù)據(jù)類型一律靠右顯示,String類型一律靠左顯示.
TableModel2.java
View Code import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TableModel1{
public TableModel1() {
JFrame f = new JFrame();
MyTable mt=new MyTable();
JTable t=new JTable(mt);
t.setPreferredScrollableViewportSize(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(s, BorderLayout.CENTER);
f.setTitle("JTable1");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new TableModel1();
}
}
class MyTable extends AbstractTableModel{
Object[][] p = {
{"阿呆", new Integer(66), new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
{"阿瓜", new Integer(85), new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},
};
String[] n = {"姓名", "語文","數(shù)學(xué)","總分","及格","作弊"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return p.length;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
return p[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
上例中表格內(nèi)的數(shù)據(jù)類型不論是String,int或是Boolean類型,都均以string的類型顯示.例如在及格的字段中,原本的數(shù)據(jù)是以 Boolean類型來表示,但顯示在JTable上時便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
8-4:TableColumnModel:
TableColumnModel本身是一個Interface,里面定義了許多與表格的"列(行)"有關(guān)的方法,例如增加列,刪除列,設(shè)置與取得"列" 的相關(guān)信息.通常我們不會直接實(shí)現(xiàn)TableColumnModel界面,而是會利用JTable的getColumnModel()方法取得 TableColumnModel對象,再利用此對象對字段做設(shè)置.舉例來說,如果我們想設(shè)計(jì)的表格是包括有下拉式列表的Combo Box,我們就能利用TableColumnModel來達(dá)到這樣的效果.我們先看看下面的例子:
View Code import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TableModel1{
public TableModel1() {
JFrame f = new JFrame();
MyTable mt=new MyTable();
JTable t=new JTable(mt);
t.setPreferredScrollableViewportSize(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(s, BorderLayout.CENTER);
f.setTitle("JTable1");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new TableModel1();
}
}
class MyTable extends AbstractTableModel{
Object[][] p = {
{"阿呆", new Integer(66), new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
{"阿瓜", new Integer(85), new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},
};
String[] n = {"姓名", "語文","數(shù)學(xué)","總分","及格","作弊"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return p.length;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
return p[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
上例中表格內(nèi)的數(shù)據(jù)類型不論是String,int或是Boolean類型,都均以string的類型顯示.例如在及格的字段中,原本的數(shù)據(jù)是以 Boolean類型來表示,但顯示在JTable上時便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
讀者運(yùn)行此程序可以發(fā)現(xiàn),利用繼承AbstractTableModel抽象類所產(chǎn)生的JTable的內(nèi)容是不能被修改的.那如果想要讓用戶可以修改表格 中的某一個字段,例如勾選Check Box或是直接修改某個字段的數(shù)字,該怎么做呢?很簡單,只要我們在范例中的MyTable類中覆寫AbstractTableModel抽象類中的 isCellEditable()方法即可.下面即是isCellEditable()的實(shí)作:
public boolean isCellEditable(int rowIndex,int columnIndex){
return true;
}
在isCellEditable()中,我們只有一行簡單的程序代碼:return true,意思是將我們表格內(nèi)的每個cell都變成可修改.但僅僅修改這個程序代碼還不行,你可以發(fā)現(xiàn)雖然表格現(xiàn)在變成了可以修改了,但更改完之后按下 Enter 鍵,內(nèi)容馬上恢復(fù)成原有的值!解決的方法是覆寫AbstractTableModel抽象類中的setValueAt()方法,這個方法主要是讓我們將改 過的值存入表格中,如下所示:
public void setValueAt(Object value,int row,int col){
p[row][col]=value;
fireTableCellUpdated(row,col);
}
其中value為我們所更改的值,我們將value存入p[row][col]中,并且調(diào)用firTableCellUpdated()函數(shù)來告訴我們的 系統(tǒng)表格已經(jīng)做了更改了,關(guān)于這一部份,我們后面會再對事件處理作詳細(xì)地介紹,在此范例中有沒有加入fireTableCellUpdated()方法對 運(yùn)行結(jié)果不會造成影響.
8-5:SelectionModel
表格的選擇模式是依據(jù)我們前面所講的ListSelectionModel而來,因此它的操作模式與事件處理跟JList沒什么分別!我們稍微復(fù)習(xí)一下ListSelectionModel這個Interface,它包含了3個常數(shù)值,如下:
static int SINGLE_SELECTION
static int SINGLE_INTERVAL_SELECTION
static int MULTIPLE_INTERVAL_SELECTION
分別可讓用戶作單一選擇,連續(xù)區(qū)間選擇與多重選擇.當(dāng)用戶作后面兩個模式的操作時,應(yīng)配合 Shift 鍵或 Ctrl 鍵.要使用ListSelectionModel可利用JTable的getSelectionModel()方法取得 ListSelectionModel對象,再利用ListSelectionModel界面所定義的setSelectionModel()來設(shè)置選擇 模式.如同JList一般,當(dāng)用戶對表格作數(shù)據(jù)域位的選取時會產(chǎn)生ListSelectionEvent事件,要處理這個事件就必須實(shí)現(xiàn) ListSelectionListener這個界面,此界面定義了一個方法,那就是valueChanged().我們來看下面的例子,用戶可在按鈕上 選擇哪種選擇模式,當(dāng)用戶選取表格數(shù)據(jù)時,程序會將用戶選取的數(shù)據(jù)顯示在表格下面的JLabel中.
SelectionModelDemo.java
View Code import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TableModel1{
public TableModel1() {
JFrame f = new JFrame();
MyTable mt=new MyTable();
JTable t=new JTable(mt);
t.setPreferredScrollableViewportSize(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(s, BorderLayout.CENTER);
f.setTitle("JTable1");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new TableModel1();
}
}
class MyTable extends AbstractTableModel{
Object[][] p = {
{"阿呆", new Integer(66), new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
{"阿瓜", new Integer(85), new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},
};
String[] n = {"姓名", "語文","數(shù)學(xué)","總分","及格","作弊"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return p.length;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
return p[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
上例中表格內(nèi)的數(shù)據(jù)類型不論是String,int或是Boolean類型,都均以string的類型顯示.例如在及格的字段中,原本的數(shù)據(jù)是以 Boolean類型來表示,但顯示在JTable上時便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
說明:在此范例中,我們要處理ActionEvent與ListSelectionEvent,因此在程序中我們要實(shí)現(xiàn)ActionListenrer與 ListSelectionListener界面,而ListSelectionEvent是屬于Swing事件,因此程序中我們要import javax.swing.event package進(jìn)來.
8-6:DefaultTableModel
我們曾提到過DefaultTableModel類,并說明了此類是繼承AbstractTableModel抽象類而來,且實(shí)現(xiàn)了 getColumnCount(),getRowCount()與getValueAt()3個方法.因此在實(shí)際的使用 上,DefaultTableModel比AbstractTableModel要來得簡單許多,也較常被拿來使用.DefaultTableModel 內(nèi)部使用Vector來使用表格的數(shù)據(jù),若佻所要顯示的表格格式是比較單純的變化,筆者建議使用DefaultTableModel類會來得方便也簡單許 多.若佻所要顯示的數(shù)據(jù)模式非常復(fù)雜,例如我們所舉的成績表格外加學(xué)生選課信息等,像這類的表格通常顯示的信息會因人面異,因此使用 AbstractTableModel會比較容易設(shè)計(jì)些.
下面是DefaultTableModel的構(gòu)造函數(shù):
DefaultTableModel():建立一個DefaultTableModel,里面沒有任何數(shù)據(jù).
DefaultTableModel(int numRows,int numColumns):建立一個指定行列數(shù)的DefaultTableModel.
DefaultTableModel(Object[][] data,Object[] columnNames):建立一個DefaultTableModel,輸入數(shù)據(jù)格式為Object Array.系統(tǒng)會自動調(diào)用setDataVector()方法來設(shè)置數(shù)據(jù)。
DefaultTableModel(Object[] columnNames,int numRows):建立一個DefaultTableModel,并具有Column Header名稱與行數(shù)信息。
DefaultTableModel(Vector columnNames,int numRows):建立一個DefaultTableModel,并具有column Header名稱與行數(shù)信息。
DefaultTableModel(Vector data,Vector columnNames):建立一個DefaultTableModel,輸入數(shù)據(jù)格式為Vector.系統(tǒng)會自動調(diào)用setDataVector()方法來設(shè)置數(shù)據(jù)。
DefaultTableModel類提供相當(dāng)多好用的方法,如之前我們談?wù)撨^的 getColumnCount(),getRowCount(),getValueAt(),isCellEditable(),setValueAt() 等方法,均可直接使用。且DefaultTableModel也提供了addColumn()與addRow()等方法,可讓我們隨時增加表格的數(shù)據(jù)。下 面我們就舉一個動態(tài)增加表格字段的例子:
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class AddRemoveCells implements ActionListener{
JTable table = null;
DefaultTableModel defaultModel = null;
public AddRemoveCells(){
JFrame f = new JFrame();
String[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
String[][] data = new String[5][5];
int value =1;
for(int i=0; i
for(int j=0; j
data[j] = String.valueOf(value++);
}
defaultModel = new DefaultTableModel(data,name);
table=new JTable(defaultModel);
table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
JPanel panel = new JPanel();
JButton b = new JButton("增加行");
panel.add(b);
b.addActionListener(this);
b = new JButton("增加列");
panel.add(b);
b.addActionListener(this);
b = new JButton("刪除行");
panel.add(b);
b.addActionListener(this);
b = new JButton("刪除列");
panel.add(b);
b.addActionListener(this);
Container contentPane = f.getContentPane();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(s, BorderLayout.CENTER);
f.setTitle("AddRemoveCells");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/*要刪除列必須使用TableColumnModel界面定義的removeColumn()方法。因此我閃先由JTable類的 getColumnModel()方法取得TableColumnModel對象,再由TableColumnModel的getColumn()方法取 得要刪除列的TableColumn.此TableColumn對象當(dāng)作是removeColumn()的參數(shù)。刪除此列完畢后必須重新設(shè)置列數(shù),也就是 使用DefaultTableModel的setColumnCount()方法來設(shè)置。*/
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("增加列")) defaultModel.addColumn("增加列");
if(e.getActionCommand().equals("增加行")) defaultModel.addRow(new Vector());
if(e.getActionCommand().equals("刪除列")){
int columncount = defaultModel.getColumnCount()-1;
if(columncount >= 0) { //若columncount<0代表已經(jīng)沒有任何列了。
TableColumnModel columnModel = table.getColumnModel();
TableColumn tableColumn = columnModel.getColumn(columncount);
columnModel.removeColumn(tableColumn);
defaultModel.setColumnCount(columncount);
}
}
if(e.getActionCommand().equals("刪除行")){
int rowcount = defaultModel.getRowCount()-1;//getRowCount返回行數(shù),rowcount<0代表已經(jīng)沒有任何行了。
if(rowcount >= 0){
defaultModel.removeRow(rowcount);
defaultModel.setRowCount(rowcount);
/*刪除行比較簡單,只要用DefaultTableModel的removeRow()方法即可。//刪除行完畢后必須重新設(shè)置列數(shù),也就是使用DefaultTableModel的setRowCount()方法來設(shè)置。*/
}
}
table.revalidate();
}
public static void main(String args[]) {
new AddRemoveCells();
}
}
總結(jié)
以上是生活随笔為你收集整理的java jtable应用源码_JTable的应用(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java access dbq 参数_J
- 下一篇: java二叉树 最大值_leetcode