java表格,java表格組件

本文目錄一覽:

如何用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.setPreferredScrollableViewportSize(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.setPreferredScrollableViewportSize(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.setPreferredScrollableViewportSize(new Dimension(550,30));

table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);

for (int i=0;i6;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.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(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.setPreferredScrollableViewportSize(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.setPreferredScrollableViewportSize(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

Java如何做動態表格?

一、動態加載表格

1.首先在html中為表格的添加位置設置id

即是在html的body標籤內部寫一個div標籤表明表格要添加到此div的內部。如下

div id=”tdl”div

2.在javascript中寫添加表格的語句

若在當前html文件中,則寫在script標籤內部,如

代碼如下:

script type=”text/javascript”

document.getElementById(“tbl”).innerHTML=”tabletrtd/td/tr/table” //此處添加的表格可根據自己需要創建

/script

若是通過引入js文件,則在js文件(假設是test.js)中直接寫如下語句

代碼如下:

document.getElementById(“tbl”).innerHTML=”tabletrtd/td/tr/table”

然後再引入自己的html文件

代碼如下:

script type=”text/javascript” src=”test.js”/script

二、 動態添加表格行

1.首先在html中為表格行的添加位置設置id,此位置必須是tbody內部(不是特別準確,但根據我的測試就得到此結論,有其他的方法請留言,謝謝),如下

代碼如下:

table

thead/thead

tfoottfoot //tfoot與thead是與tbody配套使用,但我在寫的時候,沒用也可以。

tbody id=”rows”/tbody

/table

[\s\S ]*\n

2.在javascript內容中,要先創建行和單元格,再在.tbody中添加行,如下

[code]

row=document.createElement(“tr”); //創建行

td1=document.createElement(“tr”); //創建單元格

td1.appendChild(document.createTextNode(“content”)); //為單元格添加內容

row.appendChild(td1); //將單元格添加到行內

document.getElementById(“rows”).append(row); //將行添加到tbody中

Java怎麼輸出一個表格

用java輸出數據庫表 示例:

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Font;

import java.beans.Statement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

public class Stmessege1 extends JFrame {

private static final long serialVersionUID = 1L;

private JTable table;// 聲明表格

void Stmessege11() {

setSize(460, 320);

setVisible(true);

}

public Vector getDataVector() throws SQLException, ClassNotFoundException {

Connection conn = null;

java.sql.Statement stmt = null;

Class.forName(“com.mysql.jdbc.Driver”);

String dburl = “jdbc:mysql://localhost:3306/hp”;

String dbuser = “root”;

String dbpassword = “19920102”;

conn = DriverManager.getConnection(dburl, dbuser, dbpassword);

stmt = conn.createStatement();

String sql = “select* from xsgli”;

ResultSet rs = stmt.executeQuery(sql);

Vector dataVector = new Vector();

while (rs.next()) {

Vector rowVector = new Vector();

for (int i = 1; i = 7; i++) {

if (i == 2 || i == 4) {

rowVector.add(String.valueOf(rs.getInt(i)));

} else {

rowVector.add(rs.getString(i));

}

}

dataVector.add(rowVector);

}

return dataVector;

}

public Vector getColumnVector() {

Vector columnVector = new Vector();

columnVector.add(“姓名”);

columnVector.add(“學號”);

columnVector.add(“性別”);

columnVector.add(“班級”);

columnVector.add(“系別”);

columnVector.add(“成績”);

columnVector.add(“專業”);

return columnVector;

}

public Stmessege1() throws SQLException, ClassNotFoundException {

super();

setTitle(“學生學籍數據顯示”);

setBounds(100, 100, 382, 223);

// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Connection conn = null;

Statement stmt = null;

Class.forName(“com.mysql.jdbc.Driver”);

String dburl = “jdbc:mysql://localhost:3306/hp”;

String dbuser = “root”;

String dbpassword = “19920102”;

conn = DriverManager.getConnection(dburl, dbuser, dbpassword);

java.sql.Statement st = conn.createStatement();

String sql = “select* from xsgli”;

ResultSet rs = st.executeQuery(sql);

Vector columnVector = getColumnVector();

Vector dataVector = getDataVector();

final JScrollPane scrollPane = new JScrollPane();

getContentPane().add(scrollPane, BorderLayout.CENTER);

table = new JTable(dataVector, columnVector);

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

scrollPane.setViewportView(table);

}

}

java表格代碼怎麼寫

java表格就是java swing。

//創建表頭

String[] columnNames = { “First Name”, “Last Name”, “Sport”,

“# of Years”, “Vegetarian” };

//創建顯示數據

Object[][] data = {

{ “Kathy”, “Smith”, “Snowboarding”, new Integer(5),

new Boolean(false) },

{ “John”, “Doe”, “Rowing”, new Integer(3), new Boolean(true) },

{ “Sue”, “Black”, “Knitting”, new Integer(2),

new Boolean(false) },

{ “Jane”, “White”, “Speed reading”, new Integer(20),

new Boolean(true) },

{ “Joe”, “Brown”, “Pool”, new Integer(10), new Boolean(false) } };

/*

* JTable還提供了一個重載的構造方法,傳入兩個Vector

* JTable(Vector rowData, Vector columnNames)

*

*/

final JTable table = new JTable(data, columnNames);

table.setBackground(Color.YELLOW);

java 的表格模型是什麼?

DefaultTableModel是常用的java表格模型。

參考代碼:

package com.dusd;

import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.InputEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.util.Arrays;

import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.ListSelectionModel;

import javax.swing.event.TableModelEvent;

import javax.swing.event.TableModelListener;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.JTableHeader;

import javax.swing.table.TableColumnModel;

/**

 * 表格模型事件示例

 * p

 * liA component generally gains the focus when the user clicks it, 

 * or when the user tabs between components, or otherwise interacts 

 * with a component. A component can also be given the focus programmatically,

 * such as when its containing frame or dialog-box is made visible. 

 * The snippet of the codes below shows how to give a particular component  

 * the focus every time the window gains the focus.

 * 

 * @author HAN

 * 

 */

public class TableModel extends JFrame {

/**

 * 

 */

private static final long serialVersionUID = -8581492063632813033L;

public TableModel() {

// TODO Auto-generated constructor stub

final Container container = getContentPane();

VectorString tableColumnNames = new VectorString();

tableColumnNames.add(“A”);

tableColumnNames.add(“B”);

VectorVectorString tableValues = new VectorVectorString();

for (int i = 1; i  5; i++) {

VectorString vector = new VectorString();

vector.add(“A” + i);

vector.add(“B” + i);

tableValues.add(vector);

}

final DefaultTableModel defaultTableModel = new DefaultTableModel(

tableValues, tableColumnNames);

final JTable table = new JTable(defaultTableModel);

JScrollPane scrollPane = new JScrollPane();

scrollPane.setViewportView(table);

container.add(scrollPane, BorderLayout.CENTER);

JPanel panel = new JPanel();

container.add(panel, BorderLayout.SOUTH);

JLabel labelA = new JLabel(“A: “);

final JTextField textFieldA = new JTextField(15);

JLabel labelB = new JLabel(“B: “);

final JTextField textFieldB = new JTextField(15);

JButton buttonAdd = new JButton(“添加”);

JButton buttonDel = new JButton(“刪除”);

JButton buttonDeselected = new JButton(“取消選擇”);

panel.add(labelA);

panel.add(textFieldA);

panel.add(labelB);

panel.add(textFieldB);

panel.add(buttonAdd);

panel.add(buttonDel);

panel.add(buttonDeselected);

buttonAdd.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

int[] selectedRows = table.getSelectedRows(); // table

// 默認情況容許多行選擇

VectorString rowData = new VectorString();

rowData.add(textFieldA.getText());

rowData.add(textFieldB.getText());

if (selectedRows.length == 0) {

defaultTableModel.addRow(rowData);

textFieldA.setText(null);

textFieldB.setText(null);

} else if (selectedRows.length == 1) {

// System.out.println(selectedRows[0]);

defaultTableModel.insertRow(selectedRows[0] + 1, rowData);

textFieldA.setText(null);

textFieldB.setText(null);

} else {

JOptionPane.showMessageDialog(container,

“Your operation is forbidden”, “Warning”,

JOptionPane.WARNING_MESSAGE);

}

}

});

buttonDel.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

int[] selectedRows = table.getSelectedRows(); // table

// 默認情況容許多行選擇

for (int i = 0; i  selectedRows.length; i++) {

// System.out.println(selectedRows[i]);

defaultTableModel.removeRow(selectedRows[i] – i);

}

}

});

buttonDeselected.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

table.clearSelection();

}

});

scrollPane.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

//  System.out.println(“here”);

if (e.getClickCount() == 1

 e.getButton() == MouseEvent.BUTTON1) {

table.clearSelection();

}

}

});

// make the text field focused every time the window is activated

addWindowFocusListener(new WindowAdapter() {

@Override

public void windowGainedFocus(WindowEvent e) {

// TODO Auto-generated method stub

textFieldA.requestFocus(); 

}

});

// **************************************************************

// This is a standard snippet to realize the desired column selection as in

// Excel

// **************************************************************

// row selection mode

table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

// column selection mode

TableColumnModel tableColumnModel = table.getColumnModel();

tableColumnModel.getSelectionModel().setSelectionMode(

ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

// allow the column selection (the row selection is allowed by default)

table.setColumnSelectionAllowed(true);

final JTableHeader tableHeader = table.getTableHeader();

tableHeader.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

// Extended modifiers represent the state of all modal keys,

// such as ALT, CTRL, META.

if (e.getClickCount() == 1

 e.getButton() == MouseEvent.BUTTON1) {

// Point point = new Point(e.getX(), e.getY());

Point point = new Point(e.getPoint());

int columnNum = tableHeader.columnAtPoint(point);

// System.out.println(columnNum);

int[] selectedColumns = table.getSelectedColumns();

if (selectedColumns.length != 0) {

// System.out.println(“here1”);

// System.out.println(InputEvent.getModifiersExText(e.getModifiersEx()));

if (e.getModifiersEx() == (InputEvent.CTRL_DOWN_MASK)) {

// System.out.println(“ctrl”);

if (Arrays.binarySearch(selectedColumns, columnNum) = 0) {

table.removeColumnSelectionInterval(columnNum,

columnNum);

} else {

table.addColumnSelectionInterval(columnNum,

columnNum);

}

} else if (e.getModifiersEx() == (InputEvent.SHIFT_DOWN_MASK)) {

// System.out.println(“shift”);

table.setColumnSelectionInterval(

selectedColumns[0], columnNum);

} else {

table.setColumnSelectionInterval(columnNum,

columnNum);

}

} else {

// System.out.println(“here2”);

table.setColumnSelectionInterval(columnNum, columnNum);

}

table.setRowSelectionInterval(0, table.getRowCount() – 1);

}

}

});

defaultTableModel.addTableModelListener(new TableModelListener() {

public void tableChanged(TableModelEvent e) {

// TODO Auto-generated method stub

int type = e.getType();

int firstRow = e.getFirstRow();

// int lastRow = e.getLastRow(); // the last row seems to be always equal to the first row

int column = e.getColumn();

switch (type) {

case TableModelEvent.DELETE:

System.out.print(“此次事件由 刪除 行觸發:”);

System.out.println(“此次刪除的是第 ” + firstRow + ” 行”);

break;

case TableModelEvent.INSERT:

System.out.print(“此次事件由 插入 行觸發:”);

System.out.println(“此次插入的是第 ” + firstRow + ” 行”);

break;

case TableModelEvent.UPDATE:

System.out.print(“此次事件由 更新 行觸發:”);

System.out.println(“此次更新的是第 ” + firstRow + ” 行第 ” + column + ” 列”);

break;

default:

System.out.println(“此次事件由 其他原因 觸發”);

}

}

});

}

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

TableModel frame = new TableModel();

frame.setTitle(“表格模型事件示例”);

frame.pack(); //Realize the components.

// frame.setBounds(100, 100, 600, 300);

// textFieldA.requestFocus();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true); //Display the window.

}

}

原創文章,作者:RJHT,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143732.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RJHT的頭像RJHT
上一篇 2024-10-24 15:25
下一篇 2024-10-24 15:25

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • 使用Treeview顯示錶格

    在web開發中,顯示錶格數據是一項很常見的需求。當我們需要在頁面上顯示大量數據時,除了使用傳統的表格樣式外,還可以使用Treeview這種可摺疊的表格樣式,以便更好地展示數據。本文…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論