daxia108 发表于 2004-5-28 01:13

JTable模板的应用

前一阵子在搞一个网上对象传输的程序。因为应用到了JTable,老师就给我们推荐了一个JTable的模板,一用下来效果果然不错。这个类里面的方法设置得当,又方便于嵌入GUI使用,所以也给大家介绍一下:


import java.io.*;
import java.lang.*;
import javax.swing.table.AbstractTableModel;
import java.io.Serializable;

/**
* Datenstruktur fuer eine Tabellenstruktur. Diese Datenstruktur kann
* direkt vom JTable verwendet werden. Ausserdem ist sie Serializable,
* was es erlaubt ueber das Netzwerk zu uebertragen.
*/
public class TableDataModel extends AbstractTableModel implements Serializable{
        private int rowSize=0;
        private int columnSize=0;
        private Object[][] data = null;
        private String[] columnNames = null;
        /**
       * Konstruktor der ein Tabellenstruktur anlegt.
       *
       * @param row Anzahl der Reihen.
       * @param col Anzahl der Spalten.
       *
       * @exception none
       */
        public TableDataModel(int row, int col) {
                rowSize=row;
                columnSize=col;
                data = new Object;
                columnNames = new String;
        }
        /**
       * Liefert die Anzahl Spalten der Tabellenstruktur.
       *
       * @param none
       *
       * @return (Typ: int) Anzahl Spalten.
       * @exception none
       */
        public int getColumnCount() { return columnSize; }
        /**
       * Liefert die Anzahl Spalten der Tabellenstruktur.
       *
       * @param none
       *
       * @return (Typ: int) Anzahl Spalten.
       * @exception none
       */
        public int getRowCount() { return rowSize;}
        /**
       * Liefert den Inhalt aus der Tabellenstruktur am Platz (row,col).
       *
       * @param row Reihenindex.
       * @param col Spaltenindex.
       *
       * @return (Typ: Object) Inhalt des Tabellenfeldes.
       * @exception none
       */
                     public Object getValueAt(int row, int col) { return data; }
        /**
       * Liefert Spaltenueberschriftam Platz (col).
       *
       * @param col Spaltenindex.
       *
       * @return (Typ: String) Inhalt der Tabellenueberschrift.
       * @exception none
       */
                      public String getColumnName(int col) { return columnNames; }
        /**
       * Schreiben eines Objektes in die Tabellenstruktur am Platz (row,col).
       *
       * @param val Objekt das in die Tabellenstruktur geschrieben wird.
       * @param row Reihenindex.
       * @param col Spaltenindex.
       *
       * @return none
       * @exception none
       */
        public void setValueAt(Object val, int row, int col) {
                fireTableCellUpdated(row, col);
                data=val;
        }
        /**
       * Beschriften der Tabellen am Platz (col).
       *
       * @param titel Spaltenueberschrift.
       * @param col Spaltenindex.
       *
       * @return none
       * @exception none
       */
        public void setColumnNameAt(String titel, int col) { columnNames=titel; }
        /**
       * Methode liefert true, wenn kein Objekt (Wert=null) in speziellen Tabellenstruktur
       * abgespeichert ist.
       *
       * @param row Reihenindex.
       * @param col Spaltenindex.
       *
       * @return (Typ: boolean) Ob es fuer den Benutzer erlaubt ist in der UI einen Wert einzugeben.
       * @exception none
       */
        public boolean isCellEditable(int row, int col) {
                if(data == null) return true;
                else return false;
        }
        public String toString() {
                String line = "";
                for(int i=0; i<data.length; i++){
                        for(int j=0; j<data.length; j++) {
                        line=line+"("+i+"/"+j+") "+((String) data+" ");
                        }
                }
                System.out.println();
                return line;
        }
}

daxia108 发表于 2004-5-28 01:31

因为论坛的文本显示效果不好,可能看起来有点乱,大家可以用TEXTPAD或者ECLIPSE来粘贴观看。我们可以看到,这个模板里面有设置行列标题,取行列值和设定行列值的选项,另外还有编辑单个单元格的方法以及相当方便的Object to String 的方法 ,而行列值预定则通过Konstuktur(构造方法)来实现。

下面是我应用JTable的一个很简单的GUI小程序:

import java.io.*;
import java.util.*;
import java.lang.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/**
* Fenster-Modell fuer Hitlist
*/
public class Hitlist extends JFrame implements ActionListener{

        static TableDataModel table ;
        static boolean hide = true;

/**
*Konstruktur : Title einstellen
*/
public Hitlist(String t) {
    super(t);
    }

/**
*Konstruktur : TableDataModel-Objekt einlesen
*/
public Hitlist(TableDataModel object){
          this.table = object;
}

/**
*Fenster einstellen
*/
public void init() {

   TableDataModel ergebnis = new TableDataModel(10,3);
   ergebnis.setColumnNameAt("Name", 0);
   ergebnis.setColumnNameAt("Fehler", 1);
   ergebnis.setColumnNameAt("Zeit", 2);

   for(int i=0;i<5;i++){

           ergebnis.setValueAt("args1", i, 0);
           ergebnis.setValueAt("args2", i, 1);
           ergebnis.setValueAt("args3",i, 2);
   }

   JTable table1 = new JTable(ergebnis);

   JScrollPane scroPanel = new JScrollPane();
   scroPanel.getViewport().add(table1);
   Container container = getContentPane();
   JButton close = new JButton("Close");
   close.addActionListener(this);

   container.add(BorderLayout.NORTH,new JLabel("Welcome !"));
   container.add(BorderLayout.SOUTH,close);
   container.add(BorderLayout.CENTER,scroPanel);
   }


/**
* Events
*/
public void actionPerformed(ActionEvent evt){ System.exit(0);}

/**
*Fenster initialisieren und laufen
*/
public static void main(String[] args){

    Hitlist sw = new Hitlist("Bestenliste");

    sw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sw.setSize(350,450);
    sw.init();
    sw.setVisible(true);

    }
}

大家可以试编译一下,当然TableDataModel也要附在同一目录里面来编译。另外大家也可以用偶前面介绍的JAVADOC来生成注释文档: javadoc *.java;最后希望大家能够共同探讨,共同进步。

文选流氓 发表于 2004-5-28 11:11

好贴!
我修改了一下代码显示的格式,呵呵。
谢谢daxia;)

路路 发表于 2004-5-29 14:15

谢谢

daxia108 发表于 2004-6-1 21:03

谢谢大家的捧场。大家学习JAVA有什么疑惑或者心得,都可以放上来。研究有利于进步嘛
页: [1]
查看完整版本: JTable模板的应用