日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java jtable应用源码_JTable的应用(一)

發(fā)布時(shí)間:2024/4/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java jtable应用源码_JTable的应用(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

類層次結(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():建立一個(gè)新的JTables,并使用系統(tǒng)默認(rèn)的Model.

JTable(int numRows,int numColumns):建立一個(gè)具有numRows行,numColumns列的空表格,使用的是DefaultTableModel.

JTable(Object[][] rowData,Object[][] columnNames):建立一個(gè)顯示二維數(shù)組數(shù)據(jù)的表格,且可以顯示列的名稱。

JTable(TableModel dm):建立一個(gè)JTable,有默認(rèn)的字段模式以及選擇模式,并設(shè)置數(shù)據(jù)模式。

JTable(TableModel dm,TableColumnModel cm):建立一個(gè)JTable,設(shè)置數(shù)據(jù)模式與字段模式,并有默認(rèn)的選擇模式。

JTable(TableModel dm,TableColumnModel cm,ListSelectionModel sm):建立一個(gè)JTable,設(shè)置數(shù)據(jù)模式、字段模式、與選擇模式。

JTable(Vector rowData,Vector columnNames):建立一個(gè)以Vector為輸入來源的數(shù)據(jù)表格,可顯示行的名稱。

我們先以Array構(gòu)造方式,說明如何利用JTable來建立一個(gè)簡單的表格:

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)與行對(duì)象(Column Object).利用JTable所提供的getTableHeader()方法取得行標(biāo)題。在這個(gè)例子中,我們將JTable放在 JScrollPane中,這種做法可以將Column Header與Colmn Object完整的顯示出來,因?yàn)镴ScrollPane會(huì)自動(dòng)取得Column Header.但如果文壇讀者將上面第15行去掉并修改第16行:f.getContentPane().add(table,BorderLayout.CENTER); 則運(yùn)行結(jié)果你會(huì)發(fā)現(xiàn)Column Header不見了。

如果你不想用JScrollPane,要解決這個(gè)問題,你必須將程序修改如下:

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é)果就會(huì)跟之前一樣有行標(biāo)題了.上面的運(yùn)行結(jié)果就會(huì)跟發(fā)現(xiàn),每個(gè)字段的寬度都是一樣的,除非你自行拉曳某個(gè)列寬。若我們想一開始就設(shè)置列寬的值,可以 利用TableColumn類所提供的setPreferredWidth()方法來設(shè)置,并可利用JTable類所提供的 setAutoResizeMode()方法來設(shè)置調(diào)整某個(gè)列寬時(shí)其他列寬的變化情況,我們看下面這個(gè)例子:

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對(duì)象;再利用TableColumnModel界面?所定義的getColumn()方法取TableColumn對(duì)象,利用此對(duì)象的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個(gè)參數(shù):

AUTO_RESIZE_SUBSEQUENT_COLUMENS:當(dāng)調(diào)整某一列寬時(shí),此字段之后的所有字段列寬都會(huì)跟著一起變動(dòng)。此為系統(tǒng)默認(rèn)值。

AUTO_RESIZE_ALL_COLUMNS:當(dāng)調(diào)整某一列寬時(shí),此表格上所有字段的列寬都會(huì)跟著一起變動(dòng)。

AUTO_RESIZE_OFF:當(dāng)調(diào)整某一列寬時(shí),此表格上所有字段列寬都不會(huì)跟著改變。

AUTO_RESIZE_NEXT_COLUMN:當(dāng)調(diào)整某一列寬時(shí),此字段的下一個(gè)字段的列寬會(huì)跟著改變,其余均不會(huì)變。

AUTO_RESIZE_LAST_COLUMN:當(dāng)調(diào)整某一列寬時(shí),最后一個(gè)字段的列寬會(huì)跟著改變,其余均不會(huì)改變。

由以上范例可知,利用Swing來構(gòu)造一個(gè)表格其實(shí)很簡單的,只要你利用Vector或Array來作為我們表格的數(shù)據(jù)輸入,將Vector或Array 的內(nèi)容填入JTable中,一個(gè)基本的表格就產(chǎn)生了。不過,雖然利用JTable(Object[][] rowData,Object[][] columnNames)以及JTable(Vector rowData,Vector columnNames)構(gòu)造函數(shù)來構(gòu)造構(gòu)造JTable很方便,但卻有些缺點(diǎn)。例如上例中,我們表格中的每個(gè)字段(cell)一開始都是默認(rèn)為可修改 的,用戶因此可能修改到我們的數(shù)據(jù);其次,表格中每個(gè)單元(cell)中的數(shù)據(jù)類型將會(huì)被視為同一種。在我們的例子中,數(shù)據(jù)類型皆被顯示為String的 類型,因此,原來的數(shù)據(jù)類型聲明為Boolean的數(shù)據(jù)會(huì)以String的形式出現(xiàn)而不是以檢查框(Check Box)出現(xiàn)。除此之外,如果我們所要顯示的數(shù)據(jù)是不固定的,或是隨情況而變,例如同樣是一份成績單,老師與學(xué)生所看到的表格就不會(huì)一樣,顯示的外觀或操 作模式也許也不相同。為了因應(yīng)這些種種復(fù)雜情況,上面簡單的構(gòu)造方式已不宜使用,Swing提供各種Model(如:TableModel、 TableColumnModel與ListSelectionModel)來解決上述的不便,以增加我們設(shè)計(jì)表格的彈性。我們下面就先對(duì) TableModel來做介紹:

8-2:TableModel

TableModel類本身是一個(gè)interface,在這個(gè)interface里面定義了若干的方法:包括了存取表格字段(cell)的內(nèi)容、計(jì)算表格 的列數(shù)等等的基本存取操作,讓設(shè)計(jì)者可以簡單地利用TableModel來實(shí)作他所想要的表格。TableModel界面是放在 javax.swing.table package中,這個(gè)package定義了許多JTable會(huì)用到的各種Model,讀者可利用java api文件找到這個(gè)package,并由此package找到各類或界面所定義的方法。

TableModel方法:

void addTableModelListener(TableModelListener l):使表格具有處理TableModelEvent的能力。當(dāng)表格的Table Model有所變化時(shí),會(huì)發(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ù)某個(gè)cell中的值.

boolean isCellEditable(int rowIndex,int columnIndex):返回cell是否可編輯,true的話為可編輯.

void removeTableModelListener(TableModelListener l):從TableModelListener中移除一個(gè)listener.

void setValueAt(Object aValue,int rowIndex,int columnIndex):設(shè)置某個(gè)cell(rowIndex,columnIndex)的值;

由于TableModel本身是一個(gè)Interface,因此若要直接實(shí)現(xiàn)此界面來建立表格并不是件輕松的事.幸好java提供了兩個(gè)類分別實(shí)現(xiàn)了 這個(gè)界面,一個(gè)是AbstractTableModel抽象類,一個(gè)是DefaultTableModel實(shí)體類.前者實(shí)現(xiàn)了大部份的 TableModel方法,讓用戶可以很有彈性地構(gòu)造自己的表格模式;后者繼承前者類,是java默認(rèn)的表格模式.這三者的關(guān)系如下所示:

TableModel---implements--->AbstractTableModel-----extends--->DefaultTableModel

8-3:AbstractTableModel:

java提供的AbstractTableModel是一個(gè)抽象類,這個(gè)類幫我們實(shí)現(xiàn)大部份的TableModel方法,除了 getRowCount(),getColumnCount(),getValueAt()這三個(gè)方法外.因此我們的主要任務(wù)就是去實(shí)現(xiàn)這三個(gè)方法.利用 這個(gè)抽象類就可以設(shè)計(jì)出不同格式的表格.我們來看看它所提供的方法.

AbstractTableModel方法:

void addTableModelListener(TableModelListener l):使表格具有處理TableModelEvent的能力.當(dāng)表格的Table Model有所變化時(shí),會(huì)發(fā)出TableModelEvent事件信息. ? ?   int ?findColumn(String columnName):尋找在行名稱中是否含有columnName這個(gè)項(xiàng)目.若有,則返回其所在行的位置;反之則返回-1表示未找到.

void fireTableCellUpdated(int row, int column):通知所有的Listener在這個(gè)表格中的(row,column)字段的內(nèi)容已經(jīng)改變了.

void fireTableChanged(TableModelEvent e):將所收的事件通知傳送給所有在這個(gè)table model中注冊過的TableModelListeners.

void fireTableDataChanged():通知所有的listener在這個(gè)表格中列的內(nèi)容已經(jīng)改變了.列的數(shù)目可能已經(jīng)改變了,因此JTable可能需要重新顯示此表格的結(jié)構(gòu).

void fireTableRowsDeleted(int firstRow, int lastRow):通知所有的listener在這個(gè)表格中第firstrow行至lastrow列已經(jīng)被刪除了.

void fireTableRowsUpdated(int firstRow, int lastRow):通知所有的listener在這個(gè)表格中第firstrow行至lastrow列已經(jīng)被修改了.

void fireTableRowsInserted(int firstRow, int lastRow):通知所有的listener在這個(gè)表格中第firstrow行至lastrow列已經(jīng)被加入了.

void fireTableStructureChanged():通知所有的listener在這個(gè)表格的結(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,則返回一個(gè)空的String.

Public EventListener[] getListeners(Class listenerType):返回所有在這個(gè)table model所建立的listener中符合listenerType的listener,并以數(shù)組形式返回.

boolean isCellEditable(int rowIndex, int columnIndex):返回所有在這個(gè)table model所建立的listener中符合listenerType形式的listener,并以數(shù)組形式返回.

void removeTableModelListener(TableModelListener l):從TableModelListener中移除一個(gè)listener.

void setValueAt(Object aValue, int rowIndex, int columnIndex):設(shè)置某個(gè)cell(rowIndex,columnIndex)的值.

若你仔細(xì)比較TableModel所定義的方法與上述AbstractTableModel所提供的方法,你可以發(fā) 現(xiàn),AbstractTableModel抽象類并沒有實(shí)現(xiàn)getRowCount(),getColumnCount(),getValueAt()這 三個(gè)方法,這也就是為什么我們要去實(shí)現(xiàn)這三個(gè)方法的原因.下面我們來看如何使用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上時(shí)便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個(gè)方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:

public Class getColumnClass(int c) {

return getValueAt(0, c).getClass();

}

這樣"作弊"會(huì)以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上時(shí)便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個(gè)方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:

public Class getColumnClass(int c) {

return getValueAt(0, c).getClass();

}

8-4:TableColumnModel:

TableColumnModel本身是一個(gè)Interface,里面定義了許多與表格的"列(行)"有關(guān)的方法,例如增加列,刪除列,設(shè)置與取得"列" 的相關(guān)信息.通常我們不會(huì)直接實(shí)現(xiàn)TableColumnModel界面,而是會(huì)利用JTable的getColumnModel()方法取得 TableColumnModel對(duì)象,再利用此對(duì)象對(duì)字段做設(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上時(shí)便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個(gè)方法可以讓我們分辨出表格中每一行的數(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)容是不能被修改的.那如果想要讓用戶可以修改表格 中的某一個(gè)字段,例如勾選Check Box或是直接修改某個(gè)字段的數(shù)字,該怎么做呢?很簡單,只要我們在范例中的MyTable類中覆寫AbstractTableModel抽象類中的 isCellEditable()方法即可.下面即是isCellEditable()的實(shí)作:

public boolean isCellEditable(int rowIndex,int columnIndex){

return true;

}

在isCellEditable()中,我們只有一行簡單的程序代碼:return true,意思是將我們表格內(nèi)的每個(gè)cell都變成可修改.但僅僅修改這個(gè)程序代碼還不行,你可以發(fā)現(xiàn)雖然表格現(xiàn)在變成了可以修改了,但更改完之后按下 Enter 鍵,內(nèi)容馬上恢復(fù)成原有的值!解決的方法是覆寫AbstractTableModel抽象類中的setValueAt()方法,這個(gè)方法主要是讓我們將改 過的值存入表格中,如下所示:

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)于這一部份,我們后面會(huì)再對(duì)事件處理作詳細(xì)地介紹,在此范例中有沒有加入fireTableCellUpdated()方法對(duì) 運(yùn)行結(jié)果不會(huì)造成影響.

8-5:SelectionModel

表格的選擇模式是依據(jù)我們前面所講的ListSelectionModel而來,因此它的操作模式與事件處理跟JList沒什么分別!我們稍微復(fù)習(xí)一下ListSelectionModel這個(gè)Interface,它包含了3個(gè)常數(shù)值,如下:

static int SINGLE_SELECTION

static int SINGLE_INTERVAL_SELECTION

static int MULTIPLE_INTERVAL_SELECTION

分別可讓用戶作單一選擇,連續(xù)區(qū)間選擇與多重選擇.當(dāng)用戶作后面兩個(gè)模式的操作時(shí),應(yīng)配合 Shift 鍵或 Ctrl 鍵.要使用ListSelectionModel可利用JTable的getSelectionModel()方法取得 ListSelectionModel對(duì)象,再利用ListSelectionModel界面所定義的setSelectionModel()來設(shè)置選擇 模式.如同JList一般,當(dāng)用戶對(duì)表格作數(shù)據(jù)域位的選取時(shí)會(huì)產(chǎn)生ListSelectionEvent事件,要處理這個(gè)事件就必須實(shí)現(xiàn) ListSelectionListener這個(gè)界面,此界面定義了一個(gè)方法,那就是valueChanged().我們來看下面的例子,用戶可在按鈕上 選擇哪種選擇模式,當(dāng)用戶選取表格數(shù)據(jù)時(shí),程序會(huì)將用戶選取的數(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上時(shí)便轉(zhuǎn)換成字符串形式,若想要使表格能顯示出不同的數(shù)據(jù)類型,我們要在MyTable中 Override寫getColumnClass()方法,這個(gè)方法可以讓我們分辨出表格中每一行的數(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個(gè)方法.因此在實(shí)際的使用 上,DefaultTableModel比AbstractTableModel要來得簡單許多,也較常被拿來使用.DefaultTableModel 內(nèi)部使用Vector來使用表格的數(shù)據(jù),若佻所要顯示的表格格式是比較單純的變化,筆者建議使用DefaultTableModel類會(huì)來得方便也簡單許 多.若佻所要顯示的數(shù)據(jù)模式非常復(fù)雜,例如我們所舉的成績表格外加學(xué)生選課信息等,像這類的表格通常顯示的信息會(huì)因人面異,因此使用 AbstractTableModel會(huì)比較容易設(shè)計(jì)些.

下面是DefaultTableModel的構(gòu)造函數(shù):

DefaultTableModel():建立一個(gè)DefaultTableModel,里面沒有任何數(shù)據(jù).

DefaultTableModel(int numRows,int numColumns):建立一個(gè)指定行列數(shù)的DefaultTableModel.

DefaultTableModel(Object[][] data,Object[] columnNames):建立一個(gè)DefaultTableModel,輸入數(shù)據(jù)格式為Object Array.系統(tǒng)會(huì)自動(dòng)調(diào)用setDataVector()方法來設(shè)置數(shù)據(jù)。

DefaultTableModel(Object[] columnNames,int numRows):建立一個(gè)DefaultTableModel,并具有Column Header名稱與行數(shù)信息。

DefaultTableModel(Vector columnNames,int numRows):建立一個(gè)DefaultTableModel,并具有column Header名稱與行數(shù)信息。

DefaultTableModel(Vector data,Vector columnNames):建立一個(gè)DefaultTableModel,輸入數(shù)據(jù)格式為Vector.系統(tǒng)會(huì)自動(dòng)調(diào)用setDataVector()方法來設(shè)置數(shù)據(jù)。

DefaultTableModel類提供相當(dāng)多好用的方法,如之前我們談?wù)撨^的 getColumnCount(),getRowCount(),getValueAt(),isCellEditable(),setValueAt() 等方法,均可直接使用。且DefaultTableModel也提供了addColumn()與addRow()等方法,可讓我們隨時(shí)增加表格的數(shù)據(jù)。下 面我們就舉一個(gè)動(dòng)態(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);

}

});

}

/*要?jiǎng)h除列必須使用TableColumnModel界面定義的removeColumn()方法。因此我閃先由JTable類的 getColumnModel()方法取得TableColumnModel對(duì)象,再由TableColumnModel的getColumn()方法取 得要?jiǎng)h除列的TableColumn.此TableColumn對(duì)象當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。