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;
}
}
因为论坛的文本显示效果不好,可能看起来有点乱,大家可以用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;最后希望大家能够共同探讨,共同进步。 好贴!
我修改了一下代码显示的格式,呵呵。
谢谢daxia;) 谢谢 谢谢大家的捧场。大家学习JAVA有什么疑惑或者心得,都可以放上来。研究有利于进步嘛
页:
[1]