Java Swing jTable wczytywanie danych z pliku txt do jTable

0

Witam.
Oto na mojej drodze pojawił się kolejny problem...
wstawiłem formatkę JFrame, wstawiłem jTable i wypełniłem danymi, dodałem buttony i FileChooser
następnie w 1 buttonie zrobiłem zapis danych zawartych w jTable do pliku:

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {                                         
   try {
         int i = 0;
         String a = JOptionPane.showInputDialog(this, "Podaj nazwe pliku ");
         FileWriter w = new FileWriter(a + ".txt");
            
                for ( i = 0; i < jTable2.getRowCount(); i++) {
                for (int j = 0; j < jTable2.getColumnCount(); j++) {
                      w.write(" " + jTable2.getValueAt(i, j));
                }
                w.write("\n");
            }
            w.close();
        } catch (Exception e) {
         e.getMessage();
        } 
    }             

i Teraz pojawia się problem jak wczytać dane z pliku do modelu tabeli. model tabeli : (DefaultTableModel)
Było by super gdyby można było zrobić to przez FileChooser.OpenDialog.
Proszę o pomoc :)

0

Skoro podczas zapisywania przechodzisz każdy wiersz i każdą kolumnę po kolei i zapisujesz dane jedna pod drugą to w takim sam sposób powinieneś je wczytać. Czyli idąc po wierszach dla każdej kolumny kolejna wartość z pliku. Jeśli chodzi o JFileChooser: http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html fajnie opisane.

0

Sprobowałem coś takiego... :

try {
         int b = jFileChooser3.showOpenDialog(this);
         if (b == jFileChooser3.APPROVE_OPTION) {
            File a = jFileChooser3.getSelectedFile();
            int i,j;
            
            for ( i = 0; i < jTable2.getRowCount(); i++) {
                for ( j = 0; j < jTable2.getColumnCount(); j++) {
                   jTable2.setValueAt(a, i, j);
                   }
                }
            }            
        } catch (Exception e) {
          e.getMessage();
          }       
    }              

Jednak zamiast pobrać dane z pliku to wypełniło komórki tablicy ścieżką dostępu do pliku. Przypuszczam że problem tkwi w :

jTable2.setValueAt(a, i, j);

Macie jakieś pomysły ?

0

Tak robi bo 'a' to właśnie ten plik i za każdym razem dodajesz to samo 'a'. Musisz zrobić tak, że czytasz plik linijka po linijce i dla każdego przeczytania dodajesz to co czytasz do kolejnej pozycje w tabeli. Albo odwrotnie, czyli idąc po tabeli dla każdej pozycji odczytujesz kolejny wiersz i go tam wrzucasz, to jedno i to samo w zasadzie.

0

zrobiłem wczytywanie i działa:

Scanner d = null;
        try {
         int b = jFileChooser3.showOpenDialog(this);
         if (b == jFileChooser3.APPROVE_OPTION) {
            File a = jFileChooser3.getSelectedFile();
            int i,j;
             d = new Scanner(a);
            for ( i = 0; i < jTable2.getRowCount(); i++) {
                for ( j = 0; j < jTable2.getColumnCount(); j++) {
                   String c = String.valueOf(d.next());
                   jTable2.setValueAt(c, i, j);
                   }
                }
            } 
         d.close();
        } catch (Exception e) {
          e.getMessage();
          }       
    }           

Jednak jak kolega wspomniał wyżej w komentarzu pojawia się problem z zapisem. Jeżeli w jednej komórce mam np. "ala ma kota", to zapisuje mi to w pliku txt po spacji i przy odczytywaniu wpisuje do 3 kolejnych wierszy zamiast do jednego

0

Próbowałeś tak?

String c = String.valueOf(d.nextLine());
0

Udało się ale cały czas nie do końca... Zapisuje i wczytuje tabele jak powinno jednak jeśli zapisze tabele która ma 2 wiersze i chce wczytać tabele która ma 4 wiersza. to wczytują się tylko 2, przed wczytaniem trzeba dodać 2 wiersze zeby wczytała się cała. Można jakoś ustawić automatyczne dodawanie wierszy ?
Zapis:

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
       try{
            int i = 0;
            int odpowiedz = jFileChooser4.showSaveDialog(this);
       if (odpowiedz == jFileChooser4.APPROVE_OPTION){ 
           File a = jFileChooser4.getSelectedFile();
            
            BufferedWriter w = new BufferedWriter( new FileWriter(a + ".txt"));
            
            for ( i = 0; i < jTable2.getRowCount(); i++) {
                for (int j = 0; j < jTable2.getColumnCount(); j++) {
                    w.write(" "+jTable2.getValueAt(i, j)); 
                    w.newLine();
                }     
            }
            w.close();
       }
           }catch(HeadlessException | IOException e){  
            e.getMessage();      
    }                                        
    }

Oczyt z pliku:

try{
            int i = 0;
            int odpowiedz = jFileChooser4.showSaveDialog(this);
       if (odpowiedz == jFileChooser4.APPROVE_OPTION){ 
           File a = jFileChooser4.getSelectedFile();
            
            BufferedWriter w = new BufferedWriter( new FileWriter(a + ".txt"));
            
            for ( i = 0; i < jTable2.getRowCount(); i++) {
                for (int j = 0; j < jTable2.getColumnCount(); j++) {
                    w.write(" "+jTable2.getValueAt(i, j)); 
                    w.newLine();
                }     
            }
            w.close();
       }
           }catch(HeadlessException | IOException e){  
            e.getMessage();      
    }                                        
    }
0

A co jeśli w pliku będzie mniej danych niż tabel? Wg mnie jak ktoś wczytuje to ma świadomość ile tego jest ale tak czy siak możesz przed dodaniem przeliczyć linijki i jeśli będzie tego mniej niż Twoich kolumn to dodać wiersz a z tego co widzę to jest taka metoda jak addRow, więc nie powinno być problemów.

0

Po prostu robię projekt zaliczeniowy z javy a wcześniej nie miałem do czynienia z GUI dlatego pytam :)

0

Dlatego tez takie szczegół mają znaczenie :)

0

Czyli najlepiej zliczyć ilość linii, później sprawdzić czy jest wiecej linii niż wierszy . Jeśli tak to dodać jeśli nie to nic nie robić ?:D tak ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1