2016-05-27 10 views
0

Ich erstelle eine Swing-Anwendung für die Arbeit und ich habe Probleme mit meiner JTable.Zeile wird nicht zum Ende hinzufügen meine JTable mit Vektoren

Der Prozess besteht darin, zu prüfen, ob eine Datei existiert, und wenn dies der Fall ist, rufen Sie die Informationen aus der Datei ab und füllen die JTable auf. Das funktioniert gut.

Ich gebe Daten in meine Textfelder ein, wähle aus Dropdown-Box und wenn ich auf die Schaltfläche Speichern klicke, schreibe ich die Informationen in die Datei (die ohne Problem abgeschlossen wird) und nachdem die Datei erstellt wurde, möchte ich habe die Zeile zu meinem Ende der Tabelle hinzugefügt. Hier habe ich Probleme.

Ich am Ende Aufruf der AddRow-Methode in der OutputTable meine Weitergabe der Daten von dem, was der Benutzer eingegeben hat. Die Daten werden in den Vektor richtig gespeichert, wie Sie hier sehen können:

d1 is[999999999, 27-May-2016, asdfasdf, OCOB, UA2, 1, asdf,  sadsadfasdf, IU2, 1, 28-May-2016, In Progress] 
d2 is[999999999, 27-May-2016, asdfasdf, OCOB, UA2, 1, asdf,  sadsadfasdf, IU2, 1, 28-May-2016, In Progress] 

Aber mein dtm.addRow(data) wird die Zeile der Tabelle nicht hinzufügen.

Kann jemand helfen?

Dies ist meine Klasse, die die Daten aus der Datei abruft, um die Tabelle zu Beginn meiner Anwendung zu füllen. Die Aktion wird über eine Schaltfläche ausgeführt.

Meine addRow-Methode gehört in diese Klasse.

public class OutputTable { 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public static void populateTable(Vector data){ 

     Vector columnName = new Vector(12); 

     columnName.addElement("ID"); 
     columnName.addElement("<HTML>DATE <BR/>Retrieve"); 
     columnName.addElement("<HTML>Name of <BR/>Module"); 
     columnName.addElement("<HTML>Type of <BR/>Module"); 
     columnName.addElement("<HTML>Environment <BR/>retrieve from"); 
     columnName.addElement("<HTML>Stage <BR/>retrieve from"); 
     columnName.addElement("<HTML>Working <BR/>location"); 
     columnName.addElement("<HTML>Description <BR/>of changes"); 
     columnName.addElement("<HTML>Environment <BR/>moved to"); 
     columnName.addElement("<HTML>Stage <BR/>move to"); 
     columnName.addElement("<HTML>Date of the <BR/>endevor"); 
     columnName.addElement("<HTML>Current <BR/>Work <BR/>Status"); 

     DefaultTableModel dtm = new DefaultTableModel(data, columnName); 

     final JTable table = new JTable(); 

     table.setModel(dtm); 
     table.setFillsViewportHeight(true); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 

     JScrollPane scrollPane = new JScrollPane(table); 
     table.getTableHeader().setPreferredSize(new Dimension(scrollPane.getWidth(),60)); 
     scrollPane.setViewportBorder(UIManager.getBorder("Table.scrollPaneBorder")); 
     scrollPane.setBounds(10, 425, 875, 195); 

     EndevorChanges.frmEndevorChanges.getContentPane().add(scrollPane); 

} 

    public static void addRow(String UserID, String DateRtrv, String ModRtrv, String ModType, String EnvFrom, String StgFrom, String WrkngLct, String Desc, String EnvTo, String StgTo, String DateTo, String WrkSts) { 

     System.out.println("Im inside the addrow method."); 

     Vector<Vector<String>> data = new Vector<Vector<String>>(); 
     Vector<String> d = new Vector<String>(); 
     Vector columnName = new Vector(12); 
     String[] strngArray = {UserID, DateRtrv, ModRtrv, ModType, EnvFrom, StgFrom, WrkngLct, Desc, EnvTo, StgTo, DateTo, WrkSts}; 

    /* columnName.addElement("ID"); 
     columnName.addElement("<HTML>DATE <BR/>Retrieve"); 
     columnName.addElement("<HTML>Name of <BR/>Module"); 
     columnName.addElement("<HTML>Type of <BR/>Module"); 
     columnName.addElement("<HTML>Environment <BR/>retrieve from"); 
     columnName.addElement("<HTML>Stage <BR/>retrieve from"); 
     columnName.addElement("<HTML>Working <BR/>location"); 
     columnName.addElement("<HTML>Description <BR/>of changes"); 
     columnName.addElement("<HTML>Environment <BR/>moved to"); 
     columnName.addElement("<HTML>Stage <BR/>move to"); 
     columnName.addElement("<HTML>Date of the <BR/>endevor"); 
     columnName.addElement("<HTML>Current <BR/>Work <BR/>Status"); 
     */ 
     DefaultTableModel dtm = new DefaultTableModel(data, columnName); 

     JTable table = new JTable(); 

     //table.setModel(dtm); 

     System.out.println("the data is: " + data.toString()); 

     for (int lmnts = 0; lmnts < 12; lmnts++){ 
      d.add(strngArray[lmnts]); 
      System.out.println("element" + lmnts + " value is: " + strngArray[lmnts]); 
      System.out.println("d1 is" + d); 
     } 
     data.add(d); 

     System.out.println("d2 is" + d); 

     dtm.addRow(data); 
     //dtm.insertRow(4, data); 

     dtm.fireTableDataChanged(); 

     table.repaint(); 

     System.out.println("at the end of the method"); 

    } 

} 

Antwort

2

Ihre Reihe ist in der Tat zu einem Tablemodel der JTable hinzugefügt wurde ganz gut, aber das Problem ist, dass es auf das falsch JTable hinzugefügt werden wird. Aktuelle Probleme, die sofort offensichtlich sind:

public class OutputTable { 

    public static void populateTable(Vector data){ 

     // .... code removed for brevity's sake 

     // you create a *local* DefaultTableModel variable here. It is only visible within this method 
     DefaultTableModel dtm = new DefaultTableModel(data, columnName); 

     // Likewise, this JTable variable is *local* 
     final JTable table = new JTable(); 

     // ..... 
    } 

    public static void addRow(String UserID, String DateRtrv, String ModRtrv, String ModType, String EnvFrom, String StgFrom, String WrkngLct, String Desc, String EnvTo, String StgTo, String DateTo, String WrkSts) { 

     // ..... 

     // this guy is a completely new unique DefaultTableModel object, again placed 
     // within a local variable, one only seen within this method. 
     DefaultTableModel dtm = new DefaultTableModel(data, columnName); 

     // and a new local JTable 
     JTable table = new JTable(); 


     // here you "repaint" this JTable, and it's not even displayed in your GUI 
     table.repaint(); 

    } 
} 
  • Sie Ihre Variablen deklarieren und Ihre Tablemodel und Ihre JTable innerhalb einer Methode zuweisen, diese Variablen Bedeutung sind nur sichtbar innerhalb dieser Methode und nirgendwo anders.
  • Sie erstellen dann ein neues JTable und neues Tabellenmodell innerhalb einer separaten Methode, aktualisieren das Modell und erwarten, dass die visualisierte Tabelle (ein völlig separates und einzigartiges Objekt) magisch aktualisiert wird - nicht passieren wird.
  • Sie verwenden statische Methoden, indem Sie statische Methoden verwenden.

Vorschläge:

  • private Instanz JTable und DefaultTableModel Variablen erstellen.
  • Erstellen Sie Objekte und weisen Sie diese Variablen entweder in einem Konstruktor oder in einer Instanzmethode zu.
  • Wenn Sie das Modell aktualisieren müssen, verwenden Sie die obige Variable und fügen Sie eine Zeile hinzu. Problem gelöst! Beachten Sie, dass eine BAD Lösung versucht, statische Variablen zu verwenden. Ernsthaft, geh nicht dorthin.

auch:

  • Versuchen Sie, die meisten gesamten Code aus dem statischen Bereich und in den Instanz-Bereich.
  • Die Hauptmethode sollte kurz sein und sollte nur verwendet werden, um Ihre Schlüsselobjekte zu erstellen, und dann starten Sie sie, und das war's.
  • Sie scheinen Null-Layouts und setBounds(...) zu verwenden. Während Null-Layouts und setBounds() Swing-Neulinge wie die einfachste und beste Möglichkeit erscheinen, komplexe GUI's zu erstellen, erzeugen Sie mit der Swing GUI'S die ernsteren Schwierigkeiten, denen Sie begegnen werden, wenn Sie sie benutzen. Sie werden die Größe Ihrer Komponenten nicht ändern, wenn die GUI die Größe ändert, sie sind eine royale Hexe, die verbessert oder beibehalten wird, sie scheitern komplett, wenn sie in Scrollpanels platziert werden. Sie sehen auf allen Plattformen oder Bildschirmauflösungen, die sich vom Original unterscheiden, grässlich aus .
  • Sie mischen Modell und Ansicht Code in gefährlichen und verwirrenden Möglichkeiten. Wenn Sie diese Jungs sauber trennen können, haben Sie eine viel leichtere Zeit, Ihr Programm zu debuggen und zu verbessern. Zum Beispiel sollte der Code zum Erstellen und Ändern des Tabellenmodells von dem Code getrennt sein, der der GUI JTables und JScrollPanes hinzufügt.
+0

thanx wird gehen und meine Logik ändern – steve