2016-12-04 3 views
1

Also arbeite ich gerade an einem Projekt und ich brauche eine JTable für die Anzeige von Rechnungen. Die Rechnungen werden auf einer Textdatei imErstellen Sie ein 2D-Array aus Textdatei/Array

Format gespeichert

InvoiceID, InvoiceDate, InvoiceCustomer, InvoiceComplete

(int, String, String, boolean)

Für die anderen Teile meines Programm wird jede Zeile eingelesen und ein Rechnungsobjekt erstellt.

Wie auch immer, für meine JTable bin ich nicht sicher, wie man ein 2D-Array mit den Textdateidaten erstellt. Ich dachte daran, dass ich das vielleicht zuerst versuchen würde, indem ich ein Array erstelle, bin mir aber nicht wirklich sicher. Das 2D-Array müsste vom Typ Objekt sein, da es die Rechnungen speichert, so dass ich ein Kontrollkästchen in der JTable haben kann.

Ich habe gerade gerade eine leere Klasse mit einer JTable für diese Aufgabe. Jeder Rat würde geschätzt werden. Dank

UPDATE:

JPanel invoiceViewPanel= new JPanel(null); //layout 

Object data[][]= new Object[4][10]; 
String columnHeaders[]={"Invoice ID","Invoice Name","Customer", "Complete?"}; 

DefaultTableModel model = new DefaultTableModel(data, columnHeaders) { 

boolean[] Editable= new boolean[]{ 
       false, false, false, true 
     }; 

     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return editableCells[columnIndex]; 
     } 

@Override 
public Class<?> getColumnClass(int columnIndex) 
{ 
    return columnClass[columnIndex]; 
} 
}; 

JTable table=new JTable(model); 

JScrollPane tableContainer=new JScrollPane(table);  

final Class[] columnClass = new Class[] 
{ 
Integer.class, String.class, String.class, Boolean.class 
}; 

public void launch() 
{ 
this.setLayout(new FlowLayout()); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  


this.add(invoiceViewPanel); 
invoiceViewPanel.add(tableContainer); 
createObject(); 
this.add(tableContainer); 

this.setTitle("Invoices"); 
this.setSize(500,600); 
this.setVisible(true); 
this.setResizable(false); 

} 

public void tableData() 
{ 
try 
      { 
       FileReader reader = new FileReader("Invoices.txt"); 
       BufferedReader bReader = new BufferedReader(reader); 

       String sReadline = bReader.readLine(); 
       int x=0; 

       while(sReadline!=null) 
       { 
        String[] invoiceData= sReadline.split(",");  

        data[x][0]=Integer.parseInt(invoiceData[0]); 
        data[x][1]=invoiceData[1]; 
        data[x][2]=invoiceData[2]; 
        data[x][3]=Boolean.parseBoolean(invoiceData[1]); 

        x=x+1; 

        sReadline=bReader.readLine();//sreadline 
       } 
      } 

      catch (Exception e) 
      { 
       System.out.println(e); 
      } 

} 

Ich habe zwar einzeln Zuordnung der Array-Werte versucht, entweder ich eine ArrayIndexOutOfBoundsException oder die JTable nur kommt immer noch als leere

+0

'Object [] [] table = new Object [n] [4];' Da Sie den Typen jeder Spalte kennen, können Sie sie werfen entsprechend – rafid059

Antwort

0

ich, dass zuerst gelesen und Iterierte sagen kann, durch die Zeilen dieser Textdatei und führen Sie Ihre addRow() zu Ihrer JTable-Instanz.

List<String[]> rowList = new ArrayList<String[]>(); 
FileInputStream fstream = new FileInputStream("yourfile.txt"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
     try{ 
     String[] tokens = str.split(" "); 
     //process record 
     rowList.add(tokens); 

     /*either add to row list first and then use the global variable 
     for your job or simply add row to that jTable instance 
     right here */ 

     } 
     catch (Exception e){ 
     e.printStacktrace(); 
     } 
     } 
    in.close(); 
+0

Ich bin nicht sicher, ob dies das gleiche ist, aber Ich habe etwas Ähnliches versucht. Ich hatte einen gepufferten Leser und für jede Zeile habe ich ein Objekt für das Array erstellt. Als ich es jedoch hinzugefügt habe, würde es immer noch nicht auf der JTable erscheinen. – user9123

+0

Ich habe eine neue Antwort hinzugefügt, um zu helfen. [link] (http://stackoverflow.com/a/40964571/4370219) – Smit

0

Ersetzen Sie Ihren Code mit dieser Hoffnung wird es helfen.

  JPanel invoiceViewPanel= new JPanel(null); //layout 
     List<String[]> rowList = new ArrayList<String[]>(); 
     //Object data[][]= new Object[4][10]; 
     String columnHeaders[]={"Invoice ID","Invoice Name","Customer", "Complete?"}; 

     DefaultTableModel model = new DefaultTableModel(convertToArray, columnHeaders) { 

     boolean[] Editable= new boolean[]{ 
         false, false, false, true 
       }; 

       public boolean isCellEditable(int rowIndex, int columnIndex) { 
        return editableCells[columnIndex]; 
       } 

       private Object convertToArray(){ 
        String[][] array = new String[list.size()][2]; 
        int i = 0; 
        for (String[] nestedList : rowList) { 
         array[i++] = {nestedList[0],nestedList[1]}; 
        } 
        /* 
        you can add dynamic column no. here i added 2 
        */ 
        return array; 
       } 
     @Override 
     public Class<?> getColumnClass(int columnIndex) 
     { 
      return columnClass[columnIndex]; 
     } 
     }; 

     JTable table=new JTable(model); 

     JScrollPane tableContainer=new JScrollPane(table);  

     final Class[] columnClass = new Class[] 
     { 
     Integer.class, String.class, String.class, Boolean.class 
     }; 

     public void launch() 
     { 
     this.setLayout(new FlowLayout()); 
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  


     this.add(invoiceViewPanel); 
     invoiceViewPanel.add(tableContainer); 
     createObject(); 
     this.add(tableContainer); 

     this.setTitle("Invoices"); 
     this.setSize(500,600); 
     this.setVisible(true); 
     this.setResizable(false); 

     } 

     public void tableData() 
     { 
      FileInputStream fstream = new FileInputStream("yourfile.txt"); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
      try{ 
      String[] tokens = str.split(" "); 
      //process record 
      rowList.add(tokens); 

      /*either add to row list first and then use the global variable 
      for your job or simply add row to that jTable instance 
      right here */ 

      } 
      catch (Exception e){ 
      e.printStacktrace(); 
      } 
      } 
     in.close(); 
     } 
+0

Also füge ich einfach das ganze Array mit rowList.add hinzu? Warum ist es durch nichts gespalten? – user9123

+0

Das Teilen ist nur ein Trennzeichen, in Ihrer Textdatei kann ein Trennzeichen enthalten sein. – Smit

Verwandte Themen