2017-09-23 4 views
0

UPDATE:Java TableModel wird nicht aktualisiert?

fand ich diese Antwort von @MadProgrammer und es funktionierte!

Updating JTable on button click

Grundsätzlich Sie eine Aktualisierung() -Methode, um Ihre Tablemodel hinzufügen, die in der aktualisierten Objekt nimmt. Dann wird bei jedem Drücken der Taste diese Methode des Tabellenmodells aufgerufen.

Ich nehme an, dass Sie auch JTable erweitern können und diese Methode in die erweiterte Klasse einfügen. Es könnte effizientere Lösungen geben, aber ich werde für diesen Schritt bleiben. Vielen Dank!

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

Ich mache Tabellen in Java, um Werte von Objekten aus der Klasse anzuzeigen " Esstisch". Ich habe eine benutzerdefinierte DinnerTableModel-Klasse erstellt, die AbstractTableModel erweitert und TableModel implementiert. Jedoch scheint es, dass wenn ich meine ursprünglichen "DinnerTable" -Objekte modifiziere, die entsprechenden Objekte im tableModel überhaupt nicht geändert werden. Die Lösung für dieses Problem, das ich gegoogelt habe, war, einen TableModelListener zu erstellen. Allerdings habe ich auch eine andere JTable, die diesen Listener nicht enthält, aber es funktioniert einwandfrei. Die Hauptunterschiede zwischen diesen Tabellen besteht darin, dass der JButton, der bewirkt, dass sich der Wert dieser Objekte ändert, derselbe Tab ist wie die Arbeitstabelle, aber auf einer anderen Registerkarte als die nicht funktionierende DinnerTable in JTabbedPane. Was ist eine effiziente Möglichkeit, diese DinnerTableModels zu aktualisieren? (Ich werde 38 von ihnen brauchen). Vielen Dank!

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"); 
    } 
} 
} 

//////////

+0

Sie veröffentlichen keinen gültigen [mcve] Code, der für uns kompiliert und ausgeführt wird. Wenn Sie anständige Hilfe wünschen, verbessern Sie bitte diese Frage, indem Sie diese erstellen und posten. Ja, das verlangt zusätzliche Arbeit von Ihnen, aber Sie verlangen zusätzliche Arbeit von uns, kostenlos, also ist das eine faire Bitte, sollte ich denken. –

Antwort

1

Das TableModel sollte die Daten speichern. Wenn dann die Daten geändert werden, rufen Sie die entsprechende fireXXX-Methode (...) von AbstractTableModel auf, um der Tabelle mitzuteilen, dass sie sich neu streichen soll.

Anschließend werden Änderungen an den Daten über das TableModel vorgenommen und das TableModel aktualisiert Ihr benutzerdefiniertes Objekt.

Dies bedeutet im Grunde, dass die Datenstrukturen der DinnerTable-Klasse Teil des DinnerTableModel sein sollten, keine separate Klasse.

Eine schrittweise Anleitung zum Erstellen eines benutzerdefinierten TableModel für ein benutzerdefiniertes Objekt finden Sie unter Row Table Model.

+0

Vielen Dank für Ihre Antwort. Was passiert jedoch, wenn die TabelModel-Daten nicht durch direktes Klicken auf die Tabelle geändert werden, sondern durch Drücken einer JButton-Taste aus einer anderen Registerkarte? – Ptolemorphism