簡體   English   中英

Java TableModel無法更新?

[英]Java TableModel not updating?

更新

我通過@MadProgrammer找到了這個答案,它起作用了!

單擊按鈕更新JTable

基本上,您可以在TableModel中添加一個refresh()方法來接收更新的Object。 然后,每次按下按鈕,都會調用tablemodel的此方法。

我假設您還可以擴展JTable並將此方法放入擴展類中。 可能會有更有效的解決方案,但我現在會堅持使用這一解決方案。 謝謝!

/ ******************* *************************** /

我正在用Java制作表格,以顯示“ DinnerTable”類中的Objects值。 我構建了一個自定義的DinnerTableModel類,然后擴展了AbstractTableModel並實現了TableModel。 但是,我似乎在修改原始的“ DinnerTable”對象時,tableModel中的相應對象完全沒有改變。 我用谷歌搜索解決此問題的方法是創建一個TableModelListener。 但是,我還有另一個JTable,其中沒有此偵聽器,但是它工作得很好。 這些表之間的主要區別在於,導致這些對象的值發生更改的JButton與工作表是同一Tab,但與JTabbedPane中非工作的DinnerTable處於不同的選項卡。 更新那些DinnerTableModels的有效方法是什么? (我需要38個)。 謝謝!

package DinnerList;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class DinnerTableModel extends AbstractTableModel implements TableModel{

private final String[] columnNames;
private DinnerTable dt;

public DinnerTableModel(DinnerTable popopo)
{
    dt=popopo;
    columnNames= new String[1];
    columnNames[0]=popopo.getTableNumber()+". "+popopo.getTeacherName();
}

 public String getColumnName(int col) 
{
        return columnNames[0];
}
public Object getValueAt(int rowIndex, int colIndex)
{
    if(rowIndex<7)
    {
        System.out.println(dt.getMembers().size());
        if(dt.getMembers().size()>rowIndex)
        {
            System.out.println("haha");
            return dt.getMembers().get(rowIndex);
        }
        else
        {
            return null;
        }
    }
    else
    {
        System.out.println("Error: attempting to getValue at row>=7 in DTM");
        return null;
    }
}


public Class getColumnClass(int c) 
{
    return Student.class;
}
public boolean isCellEditable(int row, int col) 
{
    return true;
}

public void setValueAt(Object b,int row, int col)
{
    if(b instanceof Student)
    {
        dt.getMembers().set(row, (Student)b);
    }
    else
    {
        System.out.println("Error: Attemping to put nonstudent into student in DTM");
    }
    fireTableCellUpdated(row, col);
}

}

///////////////////////////////////

package DinnerList;

import java.util.ArrayList;
import java.util.List;

public class DinnerTable 
{
private List<Student> members= new ArrayList<Student>(7);
private int tableNumber=0;
private int capacity=0;
private String teacherName="";
private boolean available=true;

public DinnerTable(int a, int b, String c, boolean d)
{
    tableNumber=a;
    capacity=b;
    teacherName=c;
    available=d;
}


public void add(Student s)
{
    if(available&&(members.size()<capacity))
    { this.members.add(s); }
    else if(!available)
    { System.out.println("Adding Student failed, table "+tableNumber+" not available");}
    else
    { System.out.println("Adding Student failed, table "+tableNumber+" is full");}
}


public List<Student> getMembers(){return members;}
public void remove(Student s) 
{
    if(members.contains(s))
    {
        members.remove(s);
    }
    else
    {
        System.out.println("Failed to remove student from table because it wasn't there");
    }
}
}

///////////

TableModel應該存儲數據。 然后,當數據更改時,您將調用AbstractTableModel的相應fireXXX(...)方法來告訴表重新繪制自身。

然后通過TableModel對數據進行更改,TableModel將更新您的自定義對象。

這基本上意味着DinnerTable類的數據結構應該是DinnerTableModel的一部分,而不是單獨的類。

有關為自定義對象創建自定義TableModel的逐步指南,請參見行表模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM