2016-12-04 3 views
1

Так что я сейчас работаю над проектом, и мне нужно JTable для отображения счетов-фактур. Счета хранятся в текстовом файле в форматеСоздайте 2D-массив из текстового файла/массива

InvoiceID, InvoiceDate, InvoiceCustomer, InvoiceComplete

(интермедиат, String, String, Boolean)

Для других частей моего программа, каждая строка считывается и создается объект-фактура.

Однако для моего JTable я не слишком уверен, как создать 2D-массив с данными текстового файла. Я думал, что, возможно, попытаюсь сделать это, сначала создав массив, но я не слишком уверен. 2D-массив должен быть типа Object, так как он будет хранить счета-фактуры, поэтому я могу установить флажок в JTable.

В настоящее время у меня сейчас есть пустой класс с JTable для этой задачи. Любой совет будет принят во внимание. Благодаря

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

} 

Хотя я пытался индивидуально назначая значения массива, либо я получаю ArrayIndexOutOfBoundsException или JTable просто до сих пор приходит в пустой

+0

'Object [] [] таблица = новый объект [п] [4];' Так как вы знаете тип каждого столбца, вы можете бросить их соответственно – rafid059

ответ

0

Я могу сказать, что первый читать и итерация через строки этого текстового файла и выполнить ваш addRow() в экземпляр JTable.

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

Я не уверен, если это то же самое, но Я попробовал что-то похожее на это. У меня был буферный читатель, и для каждой строки я создал объект для массива. Однако, когда я добавил его, он все равно не появлялся на JTable. – user9123

+0

Я добавил новый ответ, чтобы помочь. [link] (http://stackoverflow.com/a/40964571/4370219) – Smit

0

Замените ваш код этой надеждой, это поможет.

  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

Так что я просто добавляю во весь массив с помощью rowList.add? Почему он ничем не разбит? – user9123

+0

Разделение - это просто разделитель, в текстовом файле может быть какой-то разделитель. – Smit

Смежные вопросы