① java SWING 表頭不顯示問題
說明:jscrollPane 也是組件, 你需要把滾動面板也添加到你的布局裡.
由於你的布局是絕對布局setLayout(null); 那麼你還需要為JScrollPane 設置大小和位置
效果圖
importjavax.swing.*;
{
publicFrameDemo(){
JTabletable=newJTable(newString[][]{{"值A1","值A2"}},newString[]{"列1","列2"});
//table.setBounds(10,10,200,200);//不要為JTabel指定位置和大小
//add(table);//不要把JTabel加入到窗口上
JScrollPanejsp=newJScrollPane(table);//把Jtable加入到滾動面板上
jsp.setBounds(10,10,200,200);//指定滾動面板的位置和大小
add(jsp);//窗口添加上滾動面板
setLayout(null);//絕對布局
setResizable(false);//窗口不許縮放
setSize(320,320);//窗口大小
setLocationRelativeTo(null);//窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);//退出程序就關閉
}
publicstaticvoidmain(String[]args){
newFrameDemo().setVisible(true);
}
}
② java中選擇框的使用方法
java.awt
類 List
java.lang.Object
java.awt.Component
java.awt.List
所有已實現的介面:
ImageObserver, ItemSelectable, MenuContainer, Serializable, Accessible
--------------------------------------------------------------------------------
public class Listextends Componentimplements ItemSelectable, AccessibleList 組件為用戶提供了一個可滾動的文本項列表。可設置此 list,使其允許用戶進行單項或多項選擇。
例如以下代碼:
--------------------------------------------------------------------------------
List lst = new List(4, false);
lst.add("Mercury");
lst.add("Venus");
lst.add("Earth");
lst.add("JavaSoft");
lst.add("Mars");
lst.add("Jupiter");
lst.add("Saturn");
lst.add("Uranus");
lst.add("Neptune");
lst.add("Pluto");
cnt.add(lst);
--------------------------------------------------------------------------------
當 cnt 為容器時,將生成以下滾動列表:
如果 List 允許進行多項選擇,則單擊已選中的項時,將取消選中該項。在上面的示例中,一次只能從滾動列表中選擇一項,因為創建新的滾動列表時,第二個參數為 false。如果 List 不允許進行多項選擇,則選擇某一項會導致其他選中的項取消選中。
注意,本示例中顯示的列表是用四個可視行創建的。創建該列表之後,不可更改可視行的數量。默認的 List 是用四行創建的,所以 lst = new List() 與 list = new List(4, false) 等效。
從 Java 1.1 開始,AWT(Abstract Window Toolkit,抽象窗口工具包)會把列表上發生的所有滑鼠、鍵盤和焦點事件發送給 List 對象。(維護舊的 AWT 事件模型的目的是為了向後兼容,不推薦使用它。)
當用戶選中或取消選中某項時,AWT 將向列表發送一個 ItemEvent 實例。當用戶雙擊滾動列表中的某一項時,AWT 會在緊隨項事件後向列表發送一個 ActionEvent 實例。當用戶選中列表中的某項,按下 return 鍵時,AWT 也會生成一個動作事件。
如果應用程序需要基於此列表中用戶選中或激活的項執行某個動作,則應該相應地實現 ItemListener 或 ActionListener,並注冊新的偵聽器,以便在此列表中接收事件。
對於多項選擇滾動列表,使用外部動作(如單擊按鈕)來觸發動作被認為是一種更好的用戶界面。
從以下版本開始:
JDK1.0
另請參見:
ItemEvent, ItemListener, ActionEvent, ActionListener, 序列化表格
--------------------------------------------------------------------------------
嵌套類摘要
protected class List.AccessibleAWTList
此類實現 List 類的可訪問性支持。
從類 java.awt.Component 繼承的嵌套類/介面
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
欄位摘要
從類 java.awt.Component 繼承的欄位
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
從介面 java.awt.image.ImageObserver 繼承的欄位
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
構造方法摘要
List()
創建新的滾動列表。
List(int rows)
創建一個用指定可視行數初始化的新滾動列表。
List(int rows, boolean multipleMode)
創建一個初始化為顯示指定行數的新滾動列表。
方法摘要
void add(String item)
向滾動列表的末尾添加指定的項。
void add(String item, int index)
向滾動列表中索引指示的位置添加指定的項。
void addActionListener(ActionListener l)
添加指定的動作偵聽器以從此列表接收動作事件。
void addItem(String item)
已過時。 由 add(String) 取代。
void addItem(String item, int index)
已過時。 由 add(String, int) 取代。
void addItemListener(ItemListener l)
添加指定的項偵聽器以接收此列表的項事件。
void addNotify()
創建列表的同位體。
boolean allowsMultipleSelections()
已過時。 從 JDK version 1.1 開始,由 isMultipleMode() 取代。
void clear()
已過時。 從 JDK version 1.1 開始,由 removeAll() 取代。
int countItems()
已過時。 從 JDK version 1.1 開始,由 getItemCount() 取代。
void delItem(int position)
已過時。 由 remove(String) 和 remove(int) 取代。
void delItems(int start, int end)
已過時。 從 JDK version 1.1 開始,後來不再公開使用。只希望作為包私有方法時保留此方法。
void deselect(int index)
取消選擇指定索引處的項。
AccessibleContext getAccessibleContext()
獲取與此 List 關聯的 AccessibleContext。
ActionListener[] getActionListeners()
返回已在此列表上注冊的所有動作偵聽器的數組。
String getItem(int index)
獲取與指定索引關聯的項。
int getItemCount()
獲取列表中的項數。
ItemListener[] getItemListeners()
返回已在此列表上注冊的所有項偵聽器的數組。
String[] getItems()
獲取列表中的項。
<T extends EventListener>
T[]
getListeners(Class<T> listenerType)
返回目前已在此 List 上注冊為 FooListener 的所有對象的數組。
Dimension getMinimumSize()
確定此滾動列表的最小大小。
Dimension getMinimumSize(int rows)
獲取具有指定行數的列表的最少維數。
Dimension getPreferredSize()
獲取此滾動列表的首選大小。
Dimension getPreferredSize(int rows)
獲取具有指定行數的列表的首選維數。
int getRows()
獲取此列表中的可視行數。
int getSelectedIndex()
獲取列表中選中項的索引。
int[] getSelectedIndexes()
獲取列表中選中的索引。
String getSelectedItem()
獲取此滾動列表中選中的項。
String[] getSelectedItems()
獲取此滾動列表中選中的項。
Object[] getSelectedObjects()
獲取對象數組中此滾動列表的選中項。
int getVisibleIndex()
獲取上次由 makeVisible 方法使其可視的項的索引。
boolean isIndexSelected(int index)
確定是否已選中此滾動列表中的指定項。
boolean isMultipleMode()
確定此列表是否允許進行多項選擇。
boolean isSelected(int index)
已過時。 從 JDK version 1.1 開始,由 isIndexSelected(int) 取代。
void makeVisible(int index)
使指定索引處的項可視。
Dimension minimumSize()
已過時。 從 JDK version 1.1 開始,由 getMinimumSize() 取代。
Dimension minimumSize(int rows)
已過時。 從 JDK version 1.1 開始,由 getMinimumSize(int) 取代。
protected String paramString()
返回表示此滾動列表狀態的參數字元串。
Dimension preferredSize()
已過時。 從 JDK version 1.1 開始,由 getPreferredSize() 取代。
Dimension preferredSize(int rows)
已過時。 從 JDK version 1.1 開始,由 getPreferredSize(int) 取代。
protected void processActionEvent(ActionEvent e)
處理發生在此列表上的動作事件,方法是將這些事件指派給所有已注冊的 ActionListener 對象。
protected void processEvent(AWTEvent e)
此滾動列表的進程事件。
protected void processItemEvent(ItemEvent e)
處理發生在此列表上的項事件,方法是將這些事件指派給所有已注冊的 ItemListener 對象。
void remove(int position)
從此滾動列表中移除指定位置處的項。
void remove(String item)
從列表中移除項的第一次出現。
void removeActionListener(ActionListener l)
移除指定的動作偵聽器,以便不再從此列表接收動作事件。
void removeAll()
從此列表中移除所有項。
void removeItemListener(ItemListener l)
移除指定的項偵聽器,以便不再從此列表接收項事件。
void removeNotify()
移除此列表的同位體。
void replaceItem(String newValue, int index)
使用新字元串替換滾動列表中指定索引處的項。
void select(int index)
選擇滾動列表中指定索引處的項。
void setMultipleMode(boolean b)
設置確定此列表是否允許進行多項選擇的標志。
void setMultipleSelections(boolean b)
已過時。 從 JDK version 1.1 開始,由 setMultipleMode(boolean) 取代。
③ java程序,將Excel表顯示到Swing表格中
table = new JTable(dtModel);
table.setBounds(29, 24, 484, 216);
contentPane.add(table);
String path = textField.getText();
Read read=new Read();
read.openExcel(path);
String[][] data = new String[read.getRowCount(0)][read.getColCount(0)];
for (int i = 0; i <read.getRowCount(0); i++) {
for (int j = 0; j < read.getColCount(0); j++) {
data[i][j] = read.getCellContent(j, i);
}
}
String[] names = new String[] { "1", "2", "3" };
dtModel = new DefaultTableModel(data, names);
textField.getText();是你讀取Excel文件的根目錄版。權
④ JAVA點擊Jtable表格如何將點擊的那一行數據分別輸出出來
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
{
String[]names={"姓名","等級"};
String[][]data={{"張三","A"},{"李四","B"},{"王五","C"}};
publicTableDemo(){
JTabletable=newJTable(data,names);
JScrollPanejsp=newJScrollPane(table);
add(jsp);
setSize(300,200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//推薦
table.getSelectionModel().addListSelectionListener(newListSelectionListener(){
@Override
publicvoidvalueChanged(ListSelectionEvente){
if(!e.getValueIsAdjusting()){
//支持拖動多選
int[]rows=table.getSelectedRows();
//int[]cols=table.getSelectedColumns();//選中的列
for(inti:rows){
System.out.println("#方法一: "+table.getValueAt(i,0)+" "+table.getValueAt(i,1));
}
//支持單選
// introw=table.getSelectedRow();//選中行
// //intcol=table.getSelectedColumn();//選中列
// System.out.println("方法一:"+table.getValueAt(row,0)+" "+table.getValueAt(row,1));
}
}
});
table.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
//單選
introw=table.rowAtPoint(e.getPoint());//選中行
//intcol=table.columnAtPoint(e.getPoint());//選中列
System.out.println("*方法二: "+table.getValueAt(row,0)+" "+table.getValueAt(row,1));
}
});
}
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
newTableDemo().setVisible(true);
}
});
}
}
⑤ 如何用java應用程序創建表格
多少有點麻煩
建意不要用java來實現
JTable 組件:
類層次結構圖:
java.lang.Object
--java.awt.Component
--java.awt.Container
--javax.swing.JComponent
--javax.swing.JTabel
在使用 JTable 以前,我們先看一下它的構造函數有哪些, 以及應該如何使用:
JTabel 構造函數:
JTable():建立一個新的 JTables,並使用系統默認的 Model.
JTable(int numRows,int numColumns):建立一個具有 numRows 行,numColumns 列的空表格,
使用的是 DefaultTableModel.
JTable(Object[ ][ ] rowData,Object[ ][ ] columnNames):建立一個顯示二維數組數據的表格,且可
以顯示列的名稱。
JTable(TableModeldm):建立一個 JTable,有默認的欄位模式以及選擇模式,並設置數據模式。
JTable(TableModeldm,TableColumnModel cm):建立一個 JTable,設置數據模式與欄位模式,並
有默認的選擇模式。
JTable(TableModel dm,TableColumnModel cm,ListSelectionModel sm):建立一個 JTable,設置數
據模式、欄位模式、與選擇模式。
JTable(Vector rowData,Vector columnNames):建立一個以 Vector 為輸入來源的數據表格,可顯
示行的名稱。
我們先以 Array 構造方式,說明如何利用 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={"姓名","語文","數學","總分","及格"};
JTable table=new JTable(playerInfo,Names);
table.(new Dimension(550,30));
JScrollPane scrollPane=new JScrollPane(table);
f.getContentPane().add(scrollPane,BorderLayout.CENTER);
f.setTitle("SimpleTable");
f.pack();
f.show();
f.addWindowListener(newWindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args){
SimpleTable b=new SimpleTable();
}
}
表格由兩部份組成:分別是行標題(Column Header)與行對象(Column Object).利用 JTable
所提供的 getTableHeader()方法取得行標題。在這個例子中,我們將 JTable 放在 JScrollPane
中,這種做法可以將 Column Header 與 Colmn Object 完整的顯示出來,因為 JScrollPane 會自
動 取 得 Column Header. 但 如 果 文 壇 讀 者 將 上 面 第 15 行 去 掉 並 修 改 第 16 行 :
f.getContentPane().add(table,BorderLayout.CENTER);
則運行結果你會發現 Column Header 不見了。
如果你不想用 JScrollPane,要解決這個問題,你必須將程序修改如下:
JTable table=new JTable(p,n);
table.(new Dimension(550,30));
f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);
f.getContentPane().add(table,BorderLayout.CENTER);
運行結果就會跟之前一樣有行標題了.
上面的運行結果就會跟發現,每個欄位的寬度都是一樣的,除非你自行拉曳某個列寬。若
我們想一開始就設置列寬的值,可以利
用 TableColumn 類所提供的 setPreferredWidth()方法來設置,並可利用 JTable 類所提供的
setAutoResizeMode()方法來設置調整某個
列寬時其他列寬的變化情況,我們看下面這個例子:
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={"姓名","語文","數學","總分","及格","作弊"};
TableColumn column=null;
JTable table=new JTable(p,n);
table.(new Dimension(550,30));
table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
for (int i=0;i<6;i++){
//利用 JTable 中的 getColumnModel()方法取得 TableColumnModel 對象;再利用
TableColumnModel 界面所定義的 getColumn()方法取
//TableColumn 對象,利用此對象的 setPreferredWidth()方法就可以控制欄位的寬度.
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("SimpleTable");
f.pack();
f.show();
f.setVisible(true);
f.addWindowListener(newWindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args){
new SimpleTable2();
}
}
列可調整的 5 個參數:
AUTO_RESIZE_SUBSEQUENT_COLUMENS:當調整某一列寬時,此欄位之後的所有欄位列
寬都會跟著一起變動。此為系統默認值。
AUTO_RESIZE_ALL_COLUMNS:當調整某一列寬時,此表格上所有欄位的列寬都會跟著一
起變動。
AUTO_RESIZE_OFF:當調整某一列寬時,此表格上所有欄位列寬都不會跟著改變。
AUTO_RESIZE_NEXT_COLUMN:當調整某一列寬時,此欄位的下一個欄位的列寬會跟著改
變,其餘均不會變。
AUTO_RESIZE_LAST_COLUMN:當調整某一列寬時,最後一個欄位的列寬會跟著改變,其
余均不會改變。
由以上範例可知,利用 Swing 來構造一個表格其實很簡單的,只要你利用 Vector 或 Array
來作為我們表格的數據輸入,將 Vector 或 Array 的
內容填入 JTable 中,一個基本的表格就產生了。不過,雖然利用 JTable(Object[][]
rowData,Object[][] columnNames)以及
JTable(Vector rowData,Vector columnNames)構造函數來構造構造 JTable 很方便,但卻有些缺
點。例如上例中,我們表格中的每個欄位
(cell)一開始都是默認為可修改的,用戶因此可能修改到我們的數據;其次,表格中每個單元
(cell)中的數據類型將會被視為同一種。在我
們的例子中,數據類型皆被顯示為 String 的類型,因此,原來的數據類型聲明為 Boolean 的
數據會以 String 的形式出現而不是以檢查框(
Check Box)出現。
除此之外,如果我們所要顯示的數據是不固定的,或是隨情況而變,例如同樣是一份成績
單,老師與學生所看到的表格就不會一樣,顯
示的外觀或操作模式也許也不相同。為了因應這些種種復雜情況,上面簡單的構造方式已不
宜使用,Swing 提供各種 Model(如:
TableModel、TableColumnModel 與 ListSelectionModel)來解決上述的不便,以增加我們設計
表格的彈性。我們下面就先對 TableModel 來
做介紹:
TableModel
TableModel類本身是一個interface,在這個interface裡面定義了若乾的方法:包括了存取表
格欄位(cell)的內容、計算表格的列數等等的基本存取操作,讓設計者可以簡單地利用
TableModel 來實作他所想要的表格。TableModel 界面是放在 javax.swing.table package 中,
這個 package 定義了許多 JTable 會用到的各種 Model,讀者可利用 java api 文件找到這個
package,並由此 package 找到各類或界面所定義的方法。
TableModel 方法:
void addTableModelListener(TableModelListener l):使表格具有處理 TableModelEvent 的能
力。當表格的 Table Model 有所變化時,會發出 TableModel Event 事件信息.
Class getColumnClass(int columnIndex):返回欄位數據類型的類名稱.
int getColumnCount():返回欄位(行)數量.
String getColumnName(int columnIndex):返回欄位名稱.
int getRowCount():返回數據列數量.
Object getValueAt(int rowIndex,int columnIndex):返回數據某個 cell 中的值.
boolean isCellEditable(int rowIndex,int columnIndex):返回cell是否可編輯,true的話
為可編輯.
void removeTableModelListener(TableModelListener l):從 TableModelListener 中
移除一個 listener.
void setValueAt(Object aValue,int rowIndex,int columnIndex): 設 置 某 個
cell(rowIndex,columnIndex)的值;
由於TableModel本身是一個Interface,因此若要直接實現此界面來建立表格並不是件輕松
的事.幸好 java 提供了兩個類分別實現了這個界面,一個是 AbstractTableModel 抽象類,一個是
DefaultTableModel 實體類.前者實現了大部份的 TableModel 方法,讓用戶可以很有彈性地構
造自己的表格模式;後者繼承前者類,是 java 默認的表格模式.這三者的關系如下所示:
TableModel---implements--->AbstractTableModel-----extends--->DefaultTableModel
AbstractTableModel:
java 提供的 AbstractTableModel 是一個抽象類,這個類幫我們實現大部份的 TableModel 方
法,除了 getRowCount(),getColumnCount(),getValueAt()這三個方法外.因此我們的主要任務就
是去實現這三個方法.利用這個抽象類就可以設計出不同格式的表格.我們來看看它所
提供的方法:
AbstractTableModel 方法:
void addTableModelListener(TableModelListener l):使表格具有處理 TableModelEvent 的能
力.當表格的 Table Model 有所變化時,會發出 TableModelEvent 事件信息.
int findColumn(String columnName):尋找在行名稱中是否含有 columnName 這個項目.若
有,則返回其所在行的位置;反之則返回-1 表示
void fireTableCellUpdated(int row, int column):通知所有的 Listener 在這個表格中的
(row,column)欄位的內容已經改變了.
void fireTableChanged(TableModelEvent e):將所收的事件通知傳送給所有在這個 table
model 中注冊過的 TableModelListeners.
void fireTableDataChanged():通知所有的 listener 在這個表格中列的內容已經改變了.列的
數目可能已經改變了,因此 JTable 可能需要重新顯示此表格的結構.
void fireTableRowsDeleted(int firstRow, int lastRow):通知所有的 listener 在這個表格中第
firstrow 行至 lastrow 列已經被刪除了.
void fireTableRowsUpdated(int firstRow, int lastRow):通知所有的 listener 在這個表格中第
firstrow 行至 lastrow 列已經被修改了.
void fireTableRowsInserted(int firstRow, int lastRow):通知所有的 listener 在這個表格中第
firstrow 行至 lastrow 列已經被加入了
.
void fireTableStructureChanged():通知所有的listener在這個表格的結構已經改變了.行的數
目,名稱以及數據類型都可能已經改變了
.
Class getColumnClass(int columnIndex):返回欄位數據類型的類名稱.
String getColumnName(int column): 若 沒 有 設 置 列 標 題 則 返 回 默 認 值 , 依 次 為
A,B,C,...Z,AA,AB,..;若無此 column,則返回一個空的 String
.
Public EventListener[] getListeners(Class listenerType):返回所有在這個 table model 所建立的
listener 中符合 listenerType 的 listener,並以數組形式返回.
boolean isCellEditable(int rowIndex, int columnIndex):返回所有在這個 table model 所建立的
listener 中符合 listenerType 形式的 listener,並以數組形式返回.
voidremoveTableModelListener(TableModelListener l):從 TableModelListener 中移除一個
listener.
voidsetValueAt(Object aValue, int rowIndex, int columnIndex)
:設置某個 cell(rowIndex,columnIndex)的值.
若你仔細比較TableModel所定義的方法與上述AbstractTableModel所提供的方法,你可以發
現,AbstractTableModel 抽象類並沒有實現
getRowCount(),getColumnCount(),getValueAt()這三個方法,這也就是為什麼我們要去實現這
三個方法的原因.下面我們來看如何使用
AbstractTableModel 來實作出自己想要的表格模式.
範例:TableModel1.java
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public classTableModel1{
publicTableModel1() {
JFrame f = new JFrame();
MyTable mt=new MyTable();
JTable t=new JTable(mt);
t.(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(newWindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
newTableModel1();
}
}
class MyTable extendsAbstractTableModel{
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 = {"姓名",
"語文",
"數學",
"總分",
"及格",
"作弊"};
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();
}
}
上例中表格內的數據類型不論是 String,int 或是 Boolean 類型,都均以 string 的類型顯示.
例如在及格的欄位中,原本的數據是以 Boolean
類型來表示,但顯示在 JTable 上時便轉換成字元串形式,若想要使表格能顯示出不同的數據類
型,我們要在 MyTable 中 Override 寫 getColumnCl
ass()方法,這個方法可以讓我們分辨出表格中每一行的數據類型,並將此類型作適當的顯示:
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
這樣"作弊"會以 Check Box 顯示,數據類型一律靠右顯示,String 類型一律靠左顯示.
TableModel2.java
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public classTableModel2 implementsActionListener{
JTable t = null;
publicTableModel2() {
JFrame f = new JFrame("DataModel");
JButton b1 = new JButton("數學老師");
b1.addActionListener(this);
JButton b2 = new JButton("學生阿獃");
b2.addActionListener(this);
JPanel panel = new JPanel();
panel.add(b1);
panel.add(b2);
t=new JTable(new MyTable(1));
t.(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(panel, BorderLayout.NORTH);
f.getContentPane().add(s, BorderLayout.CENTER);
f.pack();
f.setVisible(true);
f.addWindowListener(newWindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("學生阿獃"))
t.setModel(new MyTable(1));
if (e.getActionCommand().equals("數學老師"))
t.setModel(new MyTable(2));
t.revalidate();
}
public static void main(String args[]) {
newTableModel2();
}
}
class MyTable extendsAbstractTableModel{
Object[][] p1 = {
{"阿獃", "1234",new Integer(66),
new Integer(50), new Integer(116), new Boolean(false),new Boolean(false)}};
String[] n1 = {"姓名","學號","語文","數學","總分","及格","作弊"};
Object[][] p2 = {
{"阿獃", "1234",new Integer(50), new Boolean(false),new Boolean(false),"01234"},
{"阿瓜", "1235",new Integer(75), new Boolean(true),new Boolean(false),"05678"}};
String[] n2 = {"姓名","學號","數學","及格","作弊","電話"};
int model = 1;
public MyTable(int i){
model = i;
}
public int getColumnCount() {
if(model ==1)
return n1.length;
else
return n2.length;
}
public int getRowCount() {
if(model ==1)
return p1.length;
else
return p2.length;
}
public String getColumnName(int col) {
if(model ==1)
return n1[col];
else
return n2[col];
}
public Object getValueAt(int row, int col) {
if(model == 1)
return p1[row][col];
else
return p2[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
TableColumnModel:
TableColumnModel 本身是一個 Interface,裡面定義了許多與表格的"列(行)"有關的方法,例
如增加列,刪除列,設置與取得"列"的相關信
息.通常我們不會直接實現 TableColumnModel 界面,而是會利用 JTable 的 getColumnModel()
方法取得 TableColumnModel 對象,再利用此對象對
欄位做設置.舉例來說,如果我們想設計的表格是包括有下拉式列表的 Combo Box,我們就能
利用 TableColumnModel 來達到這樣的效果.
我們先看看下面的例子:
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ColumnModelTest{
public ColumnModelTest() {
JFrame f = new JFrame();
/* 由 於 我 們 的 MyTable 類 繼 承 了 AbstractTableModel 並 且 實 作 了
getColmunCount(),getRowCount(),getValueAt()方法.因此我們可以通
*過 MyTable 來產生 TableModel 的實體.
*/
MyTable mt=new MyTable();
JTable t=new JTable(mt);//我們利用 MyTable 來建立 JTable.
JComboBox c = new JComboBox();//建立一個 JComboBox 的對象.
c.addItem("Taipei");//我們在新建立的 JComboBox 對象里新增三個項目.
c.addItem("ChiaYi");
c.addItem("HsinChu");
/*我們利用 JTable 所提供的 getTableColumnModel()方法取得 TableColumnModel 對象,
再由 TableColumnModel 類所提供的 getColumn()方
*法取得 TableColumn 對象,TableColumn 類可針對表格中的每一行做具體的設置,例如
設置欄位的寬度,某行的標頭,設置輸入較復雜的
*數據類型等等.在這里,我們利用 TableColumn 類所提供的 setCellEditor()方法,將
JComboBox 作為第二行的默認編輯組件.
*/
t.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));
t.(new Dimension(550, 30));
JScrollPane s = new JScrollPane(t);
f.getContentPane().add(s, BorderLayout.CENTER);
f.setTitle("ColumnModelTest");
f.pack();
f.setVisible(true);
f.addWindowListener(newWindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new ColumnModelTest();
}
}
class MyTable extendsAbstractTableModel{
Object[][] p = {
{"阿獃", "Taipei",new Integer(66),
new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},
{"阿瓜", "ChiaYi",new Integer(85),
new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},
};
String[] n = {"姓名",
"居住地",
"語文",
"數學",
"總分",
"及格",
"作弊"};
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();
}
/*pu