2016-09-20 12 views
0

Ich brauche Hilfe über JTable.Ich versuche, Daten aus "Contact.txt" -Datei zu lesen und meine Tabelle mit diesen Daten zu füllen. Ich kann Daten aus der Datei korrekt abrufen mit dem Hinzufügen zu Object [] [] 2D-Array ohne jedes Problem. Wenn ich versuche, dieses Objekt-Array zu Tabelle hinzufügen passiert nichts. Sorry für mein schlechtes Englisch.JTable zeigt nicht Objekt [] [] Daten

Contacts.txt-Datei enthält "Name", "Nachname", "Telefonnummer", "E-Mail" s.

Und lesen Sie diese Klasse den Text und fügen Sie ihn in diesem Objekt

public class ReadFromText { 

public boolean ReadTable(Object [][] data) { 

    boolean status = false; 

    File file = new File("/Users/MacbookPro/Documents/Contacts.txt"); 
    BufferedReader bf = null; 
    FileReader fileReader = null; 
    try { 
     fileReader = new FileReader(file); 
     bf = new BufferedReader(fileReader); 

     String textLine = null; 
     String [] text = null; 

     for (int i = 0; i < data.length; i++) { 
      for (int j = 0; j < 4; j++) { 
       while ((textLine = bf.readLine()) != null) { 
        text = textLine.split(" "); 
        data[i][j] = text[j]; 
        status = true; 
        System.out.println(data[i][j]); 
       } 
      } 
     } 
     bf.close(); 

    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
    } 
    return status; 
} 
} 

Dieser Teil des Codes von Hauptklasse:

Object [][]datas = new Object[10][4]; 

ReadFromText r = new ReadFromText(); //new object from ReadData class 
    if(r.ReadTable(datas)== true){ 
     System.out.println("OK");//just for to be sure 
    }else{ 
     System.out.println("NO"); 
    } 
    model = new DefaultTableModel(datas, columNames); 
    table = new JTable(model); 
    table.setFont(new Font("Monospaced", Font.PLAIN, 13)); 
    table.setBackground(new Color(245, 245, 245)); 
    table.setRowHeight(25); 
    table.setMinimumSize(new Dimension(60, 20)); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

Es zurückkehren "OK" überprüfen Sie es aus here

Aber JTable ist leer !!! : schau es von this picture

Ich hoffe auf jeden kann mir helfen. DANK FÜR ALLE

+0

Was bekommen Sie, wenn Sie Daten ausdrucken? – c0der

+0

@ c0der Danke für die Wiederholung, aber ich habe es versucht ..U kann das Ergebnis aus dem zweiten Bild sehen –

Antwort

1

Ihr Code zum Lesen der Daten aus der Datei falsch ist. Denken Sie eine Minute darüber nach. Sie starten die äußere Schleife mit einem Wert von 0, dann haben Sie eine innere Schleife mit einem Wert von 0 und dann lesen Sie die gesamte Datei mit der while-Schleife.

Sie möchten, dass Ihre Logik eine einzelne Datenzeile liest, diese Zeile aufteilt und hinzufügt und dann die Daten zum Array hinzufügt. So sollte die Logik so etwas wie sein:

int row = 0; 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 

    for (int i = 0; i < text.length; i++) 
    { 
     data[row][i] = text[i]; 
    } 

    row++ 
} 

Allerdings sollten Sie nicht Arrays verwenden, um die Daten zu halten. Sie sollten die Größe einer Datenstruktur niemals fest codieren, da Sie keine neuen Daten hinzufügen können. Stattdessen sollten Sie einen Vektor verwenden, um die Daten zu lesen. Dann ist es egal, ob Sie 10 Datenzeilen oder 100 Zeilen haben.

Mit diesem Ansatz würde der Code wie etwas sein:

Vector data = new Vector(); 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 
    Vector row = new Vector(); 

    for (int i = 0; i < text.length; i++) 
    { 
     row.addElement(text[i]); 
    } 
} 

So müßten Sie die Methode ändern, um den Vektor von Daten zurückzukehren. Sie müssten auch Ihre "columnNames" ändern, um sie einem Vektor hinzuzufügen, sodass Sie das TableModel mit den beiden Vektoren erstellen können.

+0

Vielen Dank. Jetzt funktioniert es, aber es füllt nur die ersten Spalten. Nun versuche ich, es richtig zu trennen. –

+0

@CoderACJHP, 'Jetzt funktioniert es, aber es füllt nur die ersten Spalten' - der Spaltenindex im Daten-Array änderte sich nie in meinem" nicht getesteten "Code. Siehe Bearbeiten für eine Möglichkeit, die Spalte zu ändern. Dies ist ein weiterer Grund, die Vektoren zu verwenden, da Sie sich keine Gedanken über Indizes machen müssen. – camickr

1

Ich hoffe, dass diese Antwort Ihnen helfen wird, das Problem zu finden. Es soll auch die Wichtigkeit der Veröffentlichung eines MCVE, wie dem folgenden, demonstriert werden:

mport java.awt.Color; importieren Sie java.awt.Dimension; importieren Sie javax.swing.JFrame; importieren javax.swing.JScrollPane; Import javax.swing.JTable; import javax.swing.table.DefaultTableModel;

public class TestTable extends JFrame { 

    public TestTable() { 

     super("Main"); 
     setSize(400, 300); 

     Object [][]datas = new Object[][]{ 
      {"A1", "A2","A3","A4"}, 
      {"B1", "B2","B3","B4"} 
     }; 

     Object[] columNames = {"Name","LastName","Phone Num","Email"}; 
     DefaultTableModel model = new DefaultTableModel(datas, columNames); 
     JTable table = new JTable(model); 
     table.setBackground(new Color(245, 245, 245)); 
     table.setRowHeight(25); 
     table.setMinimumSize(new Dimension(60, 20)); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

     add(new JScrollPane(table)); 

     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestTable(); 
    } 
} 

Nicht nur ein MCVE hilft Ihnen, eine bessere und schnellere Antwort erhalten, in vielen Fällen, wie dieser, ist es, das Problem hinweisen, hilft Pin und es selbst lösen. Das Entfernen von allem, was nicht unbedingt notwendig ist, um das Problem zu reproduzieren, hilft Ihnen (und wer immer versucht zu helfen), sich auf das Problem zu konzentrieren. In diesem Fall können Sie sehen, dass das JTable funktioniert, wenn Sie den Eingangsteil eliminieren.
enter image description here

+0

Vielen Dank für die Wiederholung.Mein Problem in 2d Array zu füllen, wenn versucht, während zu verschieben ((text = bf.readLine())! =) {} von 2 für Schleifen bekomme ich ein Ergebnis wie folgt: [Ljava.lang.String; @ 3ede05c0 –

+0

Ich weiß, das Problem ist da. Deshalb habe ich den Kommentar geschrieben "Was bekommst du, wenn du Daten ausdruckst?" – c0der

+0

Ich bekomme richtige Daten alles ist in Ordnung, aber der Tisch noch leer. Danach haben wir die Hälfte des Problems mit Mr. @ camickr gelöst :) Jetzt füllen nur noch die ersten Spalten und müssen das lösen.Vielleicht braucht man Split mit verschiedenen Regex ?? Hast du eine Ahnung davon? "nur erste Spalten füllen" THANX –