隨筆 - 154  文章 - 60  trackbacks - 0
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          聲明:

          該blog是為了收集資料,認(rèn)識(shí)朋友,學(xué)習(xí)、提高技術(shù),所以本blog的內(nèi)容除非聲明,否則一律為轉(zhuǎn)載!!

          感謝那些公開自己技術(shù)成果的高人們!!!

          支持開源,尊重他人的勞動(dòng)!!

          常用鏈接

          留言簿(3)

          隨筆分類(148)

          隨筆檔案(143)

          收藏夾(2)

          其他

          學(xué)習(xí)(技術(shù))

          觀察思考(非技術(shù))

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          8-1:使用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():建立一個(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è)簡(jiǎn)單的表格:

          1 import javax.swing.*;
          2 import java.awt.*;
          3 import java.awt.event.*;
          4 import java.util.*;
          5 public class SimpleTable{
          6 public SimpleTable(){
          7 JFrame f=new JFrame();
          8 Object[][] playerInfo={
          9   {"阿呆",new Integer(66),new Integer(32),new Integer(98),new Boolean(false)},
          10 {"阿呆",new Integer(82),new Integer(69),new Integer(128),new Boolean(true)},
          11 };
          12 String[] Names=;
          13 JTable table=new JTable(playerInfo,Names);
          14 table.setPreferredScrollableViewportSize(new Dimension(550,30));
          15 JScrollPane scrollPane=new JScrollPane(table);
          16 f.getContentPane().add(scrollPane,BorderLayout.CENTER);
          17 f.setTitle("Simple Table");
          18 f.pack();
          19 f.show();
          20 f.addWindowListener(new WindowAdapter() {
          21 public void windowClosing(WindowEvent e) {
          22 System.exit(0);
          23 }
          24 });
          24 }
          25 public static void main(String[] args){
          26   SimpleTable b=new SimpleTable();
          27 }
          28 }



          表格由兩部份組成:分別是行標(biāo)題(Column Header)與行對(duì)象(Column Object).利用JTable所提供的getTableHeader()方法取得
          行標(biāo)題。在這個(gè)例子中,我們將JTable放在JScrollPane中,這種做法可以將Column Header與Colmn Object完整的顯示出來,因?yàn)?br /> JScrollPane會(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=;
          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;i<6;i++){
          //利用JTable中的getColumnModel()方法取得TableColumnModel對(duì)象;再利用TableColumnModel界面所定義的getColumn()方法取
          //TableColumn對(duì)象,利用此對(duì)象的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("Simple Table");
          f.pack();
          f.show();
          f.setVisible(true);
          f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e)
          });  
          }
          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í)很簡(jiǎn)單的,只要你利用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ù)是不固定的,或是隨情況而變,例如同樣是一份成績(jī)單,老師與學(xué)生所看到的表格就不會(huì)一樣,顯
          示的外觀或操作模式也許也不相同。為了因應(yīng)這些種種復(fù)雜情況,上面簡(jiǎn)單的構(gòu)造方式已不宜使用,Swing提供各種Model(如:
          TableModel、TableColumnModel與ListSelectionModel)來解決上述的不便,以增加我們?cè)O(shè)計(jì)表格的彈性。我們下面就先對(duì)TableModel來
          做介紹:

          8-2:TableModel
          TableModel類本身是一個(gè)interface,在這個(gè)interface里面定義了若干的方法:包括了存取表格字段(cell)的內(nèi)容、計(jì)算表格的列數(shù)等等
          的基本存取操作,讓設(shè)計(jì)者可以簡(jiǎn)單地利用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中注冊(cè)過的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,..;若無(wú)此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

          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)
          });
          }
          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 = {"姓名",
          "語(yǔ)文",
          "數(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寫getColumnCl
          ass()方法,這個(gè)方法可以讓我們分辨出表格中每一行的數(shù)據(jù)類型,并將此類型作適當(dāng)?shù)娘@示:

          public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
          }



          這樣"作弊"會(huì)以Check Box顯示,數(shù)據(jù)類型一律靠右顯示,String類型一律靠左顯示.
          TableModel2.java

          import javax.swing.table.AbstractTableModel;
          import javax.swing.*;
          import java.awt.*;
          import java.awt.event.*;

          public class TableModel2 implements ActionListener{

          JTable t = null;

          public TableModel2() {

          JFrame f = new JFrame("DataModel");
          JButton b1 = new JButton("數(shù)學(xué)老師");
          b1.addActionListener(this);
          JButton b2 = new JButton("學(xué)生阿呆");
          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(new WindowAdapter() {
          public void windowClosing(WindowEvent e)
          });
          }

          public void actionPerformed(ActionEvent e)
          {
          if (e.getActionCommand().equals("學(xué)生阿呆"))
          t.setModel(new MyTable(1));
          if (e.getActionCommand().equals("數(shù)學(xué)老師"))
          t.setModel(new MyTable(2));
          t.revalidate();
          }

          public static void main(String args[]) {

          new TableModel2();
          }
          }

          class MyTable extends AbstractTableModel{

          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();
          }
          }



          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á)到這樣的效果.
          我們先看看下面的例子:

          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并且實(shí)作了getColmunCount(),getRowCount(),getValueAt()方法.因此我們可以通
          *過MyTable來產(chǎn)生TableModel的實(shí)體.
          */
          MyTable mt=new MyTable();
          JTable t=new JTable(mt);//我們利用MyTable來建立JTable.
          JComboBox c = new JComboBox();//建立一個(gè)JComboBox的對(duì)象.
          c.addItem("Taipei");//我們?cè)谛陆⒌腏ComboBox對(duì)象里新增三個(gè)項(xiàng)目.
          c.addItem("ChiaYi");
          c.addItem("HsinChu");
          /*我們利用JTable所提供的getTableColumnModel()方法取得TableColumnModel對(duì)象,再由TableColumnModel類所提供的getColumn()方
          *法取得TableColumn對(duì)象,TableColumn類可針對(duì)表格中的每一行做具體的設(shè)置,例如設(shè)置字段的寬度,某行的標(biāo)頭,設(shè)置輸入較復(fù)雜的
          *數(shù)據(jù)類型等等.在這里,我們利用TableColumn類所提供的setCellEditor()方法,將JComboBox作為第二行的默認(rèn)編輯組件.
          */
          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(new WindowAdapter() {
          public void windowClosing(WindowEvent e)
          });
          }

          public static void main(String args[]) {

          new ColumnModelTest();
          }

          }

          class MyTable extends AbstractTableModel{

          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 = {"姓名",
            "居住地",
          "語(yǔ)文",
          "數(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();
          }
            /*public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
          }
            public void setValueAt(Object value, int row, int col) {
          p[row][col] = value;
            fireTableCellUpdated(row, col);
          }*/
          }



          讀者運(yùn)行此程序可以發(fā)現(xiàn),利用繼承AbstractTableModel抽象類所產(chǎn)生的JTable的內(nèi)容是不能被修改的.那如果想要讓用戶可以修改表格
          中的某一個(gè)字段,例如勾選Check Box或是直接修改某個(gè)字段的數(shù)字,該怎么做呢?很簡(jiǎn)單,只要我們?cè)诜独械腗yTable類中覆寫AbstractTab
          leModel抽象類中的isCellEditable()方法即可.下面即是isCellEditable()的實(shí)作:
          public boolean isCellEditable(int rowIndex,int columnIndex){
          return true;
          }
          在isCellEditable()中,我們只有一行簡(jiǎn)單的程序代碼: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)



          其中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

          import java.awt.*;
          import java.awt.event.*;
          import javax.swing.*;
          import javax.swing.event.*;

          public class SelectionModelDemo implements ActionListener,ListSelectionListener{
          JTable table=null;
          ListSelectionModel selectionMode=null;
          JLabel label=null;//顯示用戶選取表格之用
          public SelectionModelDemo(){
            JFrame f=new JFrame();
            String[] name=;
            String[][] data=new String[5][5];
            int value=1;
            for(int i=0;i<data.length;i++){
              for (int j=0;j<data.length;j++)
            }
            table=new JTable(data,name);
            table.setPreferredScrollableViewportSize(new Dimension(400,80));
            table.setCellSelectionEnabled(true);//使得表格的選取是以cell為單位,而不是以列為單位.若你沒有寫此行,則在選取表格數(shù)
          //據(jù)時(shí)以整列為單位.
            selectionMode=table.getSelectionModel();//取得table的ListSelectionModel.
            selectionMode.addListSelectionListener(this);
            JScrollPane s=new JScrollPane(table);
            JPanel panel=new JPanel();
            JButton b=new JButton("單一選擇");
            panel.add(b);
            b.addActionListener(this);
            b=new JButton("連續(xù)區(qū)間選擇");
            panel.add(b);
            b.addActionListener(this);
            b=new JButton("多重選擇");  
            panel.add(b);
            b.addActionListener(this);
            
            label=new JLabel("你選取:");
            
            Container contentPane=f.getContentPane();
            contentPane.add(panel,BorderLayout.NORTH);
            contentPane.add(s,BorderLayout.CENTER);
            contentPane.add(label,BorderLayout.SOUTH);
            
            f.setTitle("SelectionModelDemo");
            f.pack();
            f.setVisible(true);
          f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e)
          });  
          }
          /*處理按鈕事件,利用ListSelectionModel界面所定義的setSelectionMode()方法來設(shè)置表格選取模式.*/
          public void actionPerformed(ActionEvent e){
            if (e.getActionCommand().equals("單一選擇"))
            selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            if (e.getActionCommand().equals("連續(xù)區(qū)間選擇"))
            selectionMode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            if (e.getActionCommand().equals("多重選擇"))
            selectionMode.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            table.revalidate();
          }

          /*當(dāng)用戶選取表格數(shù)據(jù)時(shí)會(huì)觸發(fā)ListSelectionEvent,我們實(shí)現(xiàn)ListSelectionListener界面來處理這一事件.ListSelectionListener界
          *面只定義一個(gè)方法,那就是valueChanged().
          */  
          public void valueChanged(ListSelectionEvent el){
            String tempString="";
          //JTable的getSelectedRows()與getSelectedColumns()方法會(huì)返回已選取表格cell的index Array數(shù)據(jù).
            int[] rows=table.getSelectedRows();
            int[] columns=table.getSelectedColumns();

          //JTable的getValueAt()方法會(huì)返回某行的cell數(shù)據(jù),返回值是Object數(shù)據(jù)類型,因此我們要自行轉(zhuǎn)成String數(shù)據(jù)類型.
            for (int i=0;i<rows.length;i++){
            for (int j=0;j<columns.length;j++)
          tempString = tempString+" "+(String)table.getValueAt(rows, columns[j]);
            }
            label.setText("你選取:"+tempString);
          }
          public static void main(String[] args){
            new SelectionModelDemo();
          }
          }

          說明:
          在此范例中,我們要處理ActionEvent與ListSelectionEvent,因此在程序中我們要實(shí)現(xiàn)ActionListenrer與ListSelectionListener界
          面,而ListSelectionEvent是屬于Swing事件,因此程序中我們要import javax.swing.event package進(jìn)來.


          8-6:DefaultTableModel
          我們?cè)岬竭^DefaultTableModel類,并說明了此類是繼承AbstractTableModel抽象類而來,且實(shí)現(xiàn)了getColumnCount(),getRowCount()
          與getValueAt()3個(gè)方法.因此在實(shí)際的使用上,DefaultTableModel比AbstractTableModel要來得簡(jiǎn)單許多,也較常被拿來使用
          .DefaultTableModel內(nèi)部使用Vector來使用表格的數(shù)據(jù),若佻所要顯示的表格格式是比較單純的變化,筆者建議使用DefaultTableModel類會(huì)
          來得方便也簡(jiǎn)單許多.若佻所要顯示的數(shù)據(jù)模式非常復(fù)雜,例如我們所舉的成績(jī)表格外加學(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<data.length; i++)
          {
            for(int j=0; j<data.length ; 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)
          });
          }
          /*要?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)

          }
          table.revalidate();
          }

          public static void main(String args[]) {
          new AddRemoveCells();
          }
          }
          JTable使用事例
          import javax.swing.*;
          import javax.swing.table.*;
          import java.awt.*;
          import java.util.*;

          public class SimpleTable {
          public SimpleTable() {
          /*表格列向量*/
          Vector cell ;
          /*表格行向量*/
          Vector row 
          = new Vector();
          /*聲明表格模型*/
          DefaultTableModel tableModel 
          = new DefaultTableModel();
          /*聲明表格頭數(shù)組*/
          String[] tableHeads 
          = {"ID","姓名""年齡""城市"};
          /*將表格頭轉(zhuǎn)換過向量類型,以備表格模型使用*/
          Vector tableHeadName 
          = new Vector();
          for (int i = 0; i < tableHeads.length; i++{
          tableHeadName.add(tableHeads[i]);
          }

          /*初始化表格數(shù)據(jù),這些數(shù)據(jù)實(shí)例運(yùn)行來源于數(shù)據(jù)庫(kù)中*/
          for (int i = 1; i <= 100; i++{
          cell 
          = new Vector();
          cell.add(
          "" + i);
          cell.add(
          " shit"+i);
          cell.add(
          " 22");
          cell.add(
          " 上海");
          row.add(cell);
          }

          /*設(shè)置表格模型*/
          tableModel.setDataVector(row, tableHeadName);
          /*表格使用模型*/
          JTable table 
          = new JTable(tableModel);
          table.setRowHeight(
          20);
          /*new Cursor(1)設(shè)置鼠標(biāo)指針樣式,12為手形*/
          table.setCursor(
          new Cursor(12));
          table.setSelectionBackground(Color.black);
          table.setSelectionForeground(Color.white);
          table.setGridColor(Color.black);
          makeFace(table);
          table.setBackground(
          new Color(206,120,50));
          table.setCellSelectionEnabled(
          false);
          JScrollPane scrollPane 
          = new JScrollPane(table);
          scrollPane.setCursor(
          new Cursor(12));
          this.getContentPane().add(scrollPane);
          this.setTitle("使用JTable表格的例子");
          this.setSize(400300);
          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          this.setVisible(true);
          }


          /*表格間隔色顯示方法*/
          public static void makeFace(JTable table) {

          try {
          DefaultTableCellRenderer tcr 
          = new DefaultTableCellRenderer() {
          public Component getTableCellRendererComponent(JTable table,
          Object value, 
          boolean isSelected, boolean hasFocus,
          int row, int column) {
          if (row % 2 == 0)
          setBackground(Color.white); 
          /*設(shè)置奇數(shù)行底色*/
          else if (row % 2 == 1)
          setBackground(
          new Color(206231255)); /*設(shè)置偶數(shù)行底色*/
          return super.getTableCellRendererComponent(table, value,
          isSelected, hasFocus, row, column);
          }

          }
          ;
          for (int i = 0; i < table.getColumnCount(); i++{
          table.getColumn(table.getColumnName(i)).setCellRenderer(tcr);
          }

          }
           catch (Exception ex) {
          ex.printStackTrace();
          }


          }


          }


          posted on 2007-11-06 09:06 lk 閱讀(1530) 評(píng)論(0)  編輯  收藏 所屬分類: j2se
          主站蜘蛛池模板: 乡城县| 鄂尔多斯市| 读书| 疏勒县| 荣昌县| 铁力市| 连州市| 营山县| 宁南县| 施秉县| 鹰潭市| 兴国县| 景谷| 乌苏市| 铜梁县| 桂东县| 灵宝市| 平谷区| 保靖县| 丹凤县| 崇义县| 新竹市| 高唐县| 延川县| 乳山市| 日喀则市| 盐城市| 长沙市| 清新县| 积石山| 柏乡县| 蚌埠市| 奉新县| 长乐市| 贵港市| 淄博市| 牙克石市| 海丰县| 崇义县| 长治市| 修文县|