<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 45, 文章 - 6, 評論 - 4, 引用 - 0
    數據加載中……

    如何用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); //JFrame中僅包含一個JRootPane子容器。在   //JFrame中顯示的所有非菜單組件均應該包含在JRootPane所提供的Content pane中因此frame.add(child);是錯誤的
       f.setTitle("SimpleTable");
       f.pack();
       f.show();
       app.addWindowListener
       (
          new WindowAdapter()
          {
                    public void windowClosing(WindowEvent e)
                    {
                    System.exit(0);
                    }
          }
       );
    }
    public static void main(String[] args)
    {
        SimpleTable b=new SimpleTable();
    }
    }
    運行結果:


    由以上范例可知,利用 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 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 = {"姓名",
    "語文",
    "數學",
    "總分",
    "及格",
    "作弊"};
    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 class TableModel2 implements ActionListener
    {
    JTable t = null;
    public TableModel2() {
    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(new WindowAdapter() {
    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[])
    {
       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();
    }
    }

    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(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
       System.exit(0);
       }
       });
       }
       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 = {"姓名",
       "居住地",
       "語文",
       "數學",
       "總分",
       "及格",
       "作弊"};
       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();
    }
    }


    表格由兩部份組成:分別是行標題(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;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("SimpleTable2");
    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();
    }
    }

    運行結果:

    列可調整的 5 個參數:
    AUTO_RESIZE_SUBSEQUENT_COLUMENS:當調整某一列寬時,此字段之后的所有字段列
    寬都會跟著一起變動。此為系統默認值。
    AUTO_RESIZE_ALL_COLUMNS:當調整某一列寬時,此表格上所有字段的列寬都會跟著一
    起變動。
    AUTO_RESIZE_OFF:當調整某一列寬時,此表格上所有字段列寬都不會跟著改變。
    AUTO_RESIZE_NEXT_COLUMN:當調整某一列寬時,此字段的下一個字段的列寬會跟著改
    變,其余均不會變。
    AUTO_RESIZE_LAST_COLUMN:當調整某一列寬時,最后一個字段的列寬會跟著改變,其
    余均不會改變。

    posted on 2008-09-12 15:31 liyang 閱讀(7368) 評論(0)  編輯  收藏

    主站蜘蛛池模板: 亚洲AV无码一区二区三区电影| 亚洲色欲色欱wwW在线| 狠狠综合亚洲综合亚洲色| 人禽杂交18禁网站免费| 狠狠色伊人亚洲综合网站色| 免费日本一区二区| 久久久久亚洲Av无码专| 蜜桃AV无码免费看永久| 亚洲日韩aⅴ在线视频| 国产精品永久免费视频| 中文字幕精品亚洲无线码二区| 亚洲AV无码不卡在线播放| 福利免费在线观看| 亚洲人成电影福利在线播放| 国产精品免费AV片在线观看| 中文字幕亚洲色图| 成年女人18级毛片毛片免费 | 久久久久久久久无码精品亚洲日韩| 无遮挡呻吟娇喘视频免费播放| 国产成人一区二区三区视频免费| 最新免费jlzzjlzz在线播放| 亚洲av日韩av永久无码电影| 国产一区二区三区免费看| 72pao国产成视频永久免费| 欧洲亚洲国产清在高| 亚洲一区二区三区高清| 1000部禁片黄的免费看| 亚洲欧美日韩中文字幕在线一区| 久久久久久久久久国产精品免费 | 国产1024精品视频专区免费| 亚洲国产AV无码一区二区三区| 久久爰www免费人成| 精品国产成人亚洲午夜福利| 在线亚洲人成电影网站色www| 亚洲精品女同中文字幕| 精品亚洲综合久久中文字幕| 亚洲大片免费观看| 日日狠狠久久偷偷色综合免费 | 伊人免费在线观看高清版| 亚洲欧洲日韩在线电影| 日韩精品电影一区亚洲|