2009-06-16 82 views
1

我可以在没有问题的情况下在JTable中显示我的数据,但是当我想在应用程序运行时进行过滤时,JTable未显示数据更改。我搜索了它,发现了一个名为TableModel的类,但我无法写出我的AbstractTableModel。任何人都可以告诉我我该如何做到这一点?Java中的JTable TableModel问题

Personelz.Java

package deneme.persistence; 

import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeSupport; 
import java.io.Serializable; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.persistence.Transient; 

/** 
* 
* @author İbrahim AKGÜN 
*/ 
@Entity 
@Table(name = "PERSONELZ", catalog = "tksDB", schema = "dbo") 
@NamedQueries({@NamedQuery(name = "Personelz.findAll", query = "SELECT p FROM Personelz p"), @NamedQuery(name = "Personelz.findByPersonelıd", query = "SELECT p FROM Personelz p WHERE p.personelıd = :personelıd"), @NamedQuery(name = "Personelz.findByAd", query = "SELECT p FROM Personelz p WHERE p.ad = :ad"), @NamedQuery(name = "Personelz.findBySoyad", query = "SELECT p FROM Personelz p WHERE p.soyad = :soyad")}) 
public class Personelz implements Serializable { 
    @Transient 
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Basic(optional = false) 
    @Column(name = "PERSONELID", nullable = false) 
    private Integer personelıd; 
    @Column(name = "AD", length = 50) 
    private String ad; 
    @Column(name = "SOYAD", length = 50) 
    private String soyad; 
    @Column(name = "YAS") 
    private Integer yas; 
    public Personelz() { 
    } 

    public Personelz(Integer personelıd) { 
     this.personelıd = personelıd; 
    } 

    public Integer getPersonelıd() { 
     return personelıd; 
    } 

    public void setPersonelıd(Integer personelıd) { 
     this.personelıd = personelıd; 
    } 

    public String getAd() { 
     return ad; 
    } 

    public void setAd(String ad) { 
     String oldAd = this.ad; 
     this.ad = ad; 
     changeSupport.firePropertyChange("ad", oldAd, ad); 
    } 

    public String getSoyad() { 
     return soyad; 
    } 

    public void setSoyad(String soyad) { 
     String oldSoyad = this.soyad; 
     this.soyad = soyad; 
     changeSupport.firePropertyChange("soyad", oldSoyad, soyad); 
    } 
    public Integer getYas() { 
     return yas; 
    } 
public void setYas(Integer yas){ 
this.yas = yas; 

} 

的TableModel

public class TableModel extends AbstractTableModel { 

String[] headers; 
List<Personelz> personel; 
int row; 
int column; 
Object[][] per; 
/** Creates a new instance of TableModel */ 
    @SuppressWarnings("empty-statement") 
public TableModel(List<Personelz> p) { 

    this.personel = p; 
    column=2; 
    row=this.personel.size(); 

    headers=new String[column]; 
    headers[0]="AD"; 
    headers[1]="SOYAD"; 
    per={p.toArray(),p.toArray()}; 

} 

public int getColumnCount() 
{ 
    return column; 
} 
public int getRowCount() 
{ 
    return row; 
} 
public Object getValueAt(int rowIndex, int kolonindex) 
{ 

    return per[rowIndex][kolonindex]; 
} 
public String getColumnName(int i) 
{ 
    return headers[i]; 
} 

回答

5

我建议您阅读(使用Java教程Swing组件)这个How to Use Tables

基本上为TableModel有通知的变化表数据通过发射适当的事件。请参阅here

+0

抖动是正确的。 JTable监听TableModel。 TableModel在其状态发生更改时触发TableModelEvent到其侦听器。您可以扩展AbstractTableModel或使用DefaultTableModel,它有一些支持来管理侦听器并触发事件。 – 2009-06-16 22:44:43

1

您应该使用您的JTable实现的TableModelListener接口。将表添加到TableModel后,请拨打AbstractTableModel实施的适当的fireTableChanged()型事件。这应该强制您的JTable更新。

当您的过滤器操作返回时,仍然需要实施一种方法来重置模型中的数据。应该用这种方法,你可以打电话给你的fireTableChanged()事件。您还应该确保在触发表更改的事件时处于AWT线程中。

2

有一个名为GlazedLists的非常好的库,它使得使用列表和表格(包括列排序和行过滤)变得简单很多。

它绝对值得一看。

http://publicobject.com/glazedlists/

HTH