Consenso all'uso dei cookies

SITO1 -- SITO2 -- Forum1 -- CercaGlobale -- Informativa su Cookie e Privacy


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
[RISOLTO] JAVA leggere csv in jtable e salvare modifiche
#1
questo codice legge il csv e crea la jtable, vorrei aggiungere un pulsante SALVA e non riesco a fare l'ADD
Codice:
package csv;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class csv {
   public static void main(String[] args) {
       try {
           String datafile = "Rubrica.txt";
           FileReader fin = new FileReader(datafile);
           DefaultTableModel m = createTableModel(fin, null);
           JFrame f = new JFrame();
           f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           f.getContentPane().add(new JScrollPane(new JTable(m)));
           f.setSize(400, 300);
           f.setVisible(true);
/*            FileWriter out = new FileWriter("Rubrica.csv");
           defaultTableModelToStream(m, out);
           out.close();*/
       } catch (Exception e) {
           e.printStackTrace();
       }
   }


   public static void defaultTableModelToStream(DefaultTableModel dtm,
       Writer out) throws IOException {
       final String LINE_SEP = System.getProperty("line.separator");
       int numCols = dtm.getColumnCount();
       int numRows = dtm.getRowCount();

       // Write headers
       String sep = "";

       for (int i = 0; i < numCols; i++) {
           out.write(sep);
           out.write(dtm.getColumnName(i));
           sep = ",";
       }

       out.write(LINE_SEP);

       for (int r = 0; r < numRows; r++) {
           sep = "";

           for (int c = 0; c < numCols; c++) {
               out.write(sep);
               out.write(dtm.getValueAt(r, c).toString());
               sep = ",";
           }

           out.write(LINE_SEP);
       }
   }

   public static DefaultTableModel createTableModel(Reader in,
       Vector<Object> headers) {
       DefaultTableModel model = null;
       Scanner s = null;

       try {
           Vector<Vector<Object>> rows = new Vector<Vector<Object>>();
           s = new Scanner(in);

           while (s.hasNextLine()) {
               rows.add(new Vector<Object>(Arrays.asList(s.nextLine()
                                                          .split("\\s*,\\s*",
                               -1))));
           }

           if (headers == null) {
               headers = rows.remove(0);
               model = new DefaultTableModel(rows, headers);
           } else {
               model = new DefaultTableModel(rows, headers);
           }

           return model;
       } finally {
           s.close();
       }
   }
}
Cita messaggio
Grazie da:
#2
ho provato col BorderLayout in questo modo:
Codice:
public static void main(String[] args) {
       try {
           String datafile = "Rubrica.txt";
           FileReader fin = new FileReader(datafile);
           DefaultTableModel m = createTableModel(fin, null);
           JFrame f = new JFrame();
           Container c = f.getContentPane();
           c.setLayout(new BorderLayout());
           f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           c.add(new JScrollPane(new JTable(m)),BorderLayout.NORTH);
           JButton button = new JButton("Click here!");
           JPanel panel = new JPanel();
           c.add(button,BorderLayout.SOUTH);
           f.getContentPane().add(panel);
           f.setSize(400, 200);
           f.setVisible(true);
ma il risultato è quello in allegato, il pulsante è lontano dalla tabella


Allegati Anteprime
   
Cita messaggio
Grazie da:
#3
Invece di aggiungere a nord la tabella procedi in un altro modo:
nel JPanel che hai crateo imposta il layout del flusso, poi aggiungi a tale JPanel prima la tabella e poi il pulsante; in questo modo dovrebbero essere affiancati; infine aggiungi il JPanel alla finestra (a nord o al centro);
quando usi un layout, per esempio il BordeLayout, il pannello su cui lo aggiungi viene diviso in zone (in questo caso nord, sud, est, ovest e centro);
ogni zona però può contenere un solo elemento così, per esempio se aggiungi un bottone a sud esso occupa l'intera zona sud.
Il trucco è di aggiungere pannelli con un layout del flusso;
immagina che la finestra sia una parete, dividi la parete in zone (per es. con Border Layout); su ogni zona della parete puoi appendere un solo quadro; per appendere a est 2 quadri devi prima creare un pannello con layout del flusso, appenderci 2 quadri, appendere il pannello (che contiene 2 quadri) a est sulla parete
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da:
#4
Scusami BAT, ma non credo che il problema sia nel layout, piuttosto che la table venga creata troppo grande, infatto se porto il button in alto il risultato è questo


Allegati Anteprime
   
Cita messaggio
Grazie da:
#5
Il problema in realtà è in entrambe le cose, costruire GUI decenti purtroppo è macchinoso e bisogna fare parecchia pratica di "incollaggio" pannelli (se, come me, ti limiti ad usare BorderLayout e FlowLayout) a meno che di non studiarsi i layout avanzati.

Allego cartella con codice e file di prova, esaminalo attentamente e attento a mettere nel try-catch il minimo indispensabile;
compila ed esegui il file CSV.java (occhio: il nome è in tutto MAIUSCOLO, la prass per le classi vuole che il nome di classe cominci per lettera maiuscola).
Prova a ridimensionare la finestra (allargala e stringila) e osserva cosa succede;
poi prova a cambiare l'ordine di aggiunta (metti prima il bottone e poi la tabella, vedrai i bottone a sinistra/alto a seconda delle dimensioni della finestra).


Allegati
.zip   CSV.zip (Dimensione: 1,63 KB / Download: 1)
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da:
#6
ottimo BAT
Cita messaggio
Grazie da:
#7
ho aggiunto il seguente codice relativo al pulsante SALVA
Codice:
      button.addActionListener(new ActionListener() {
           //@Override
           public void actionPerformed(ActionEvent e) {
           String filePath = "Rubrica.csv";
           File file = new File(filePath);
           try {
               FileWriter fw = new FileWriter(file);
               BufferedWriter bw = new BufferedWriter(fw);
           
               for(int i = 0; i < m.getRowCount(); i++){//rows-----------------------
                   for(int j = 0; j < m.getColumnCount(); j++){//columns------------------
                       bw.write(m.getValueAt(i, j).toString()+",");//------------------------
                   }
                   bw.newLine();
               }
           
               bw.close();
               fw.close();
           
           } catch (IOException ex) {
//           Logger.getLogger(csv.class.getName()).log(Level.SEVERE, null, ex);
           }                
               
      }});
perché mi vengono sottolineate in rosso le righe commentate con --------------- ?
Cita messaggio
Grazie da:
#8
probabilmente m è "out of scope" cioè hai definito m in un pezzo di codice non accessibile dal ciclo;
però quando hai di questi dubbi non devi postarmi solo un pezzo di codice, zippa il file e postalo tutto altrimenti mi è impossibile verificare cosa dice il compilatore Java (tra l'altro l'errore ti dovrebbe essere descritto, devi imparare a decifrare cosa dice l'errore, non soloa sapere che c'è)
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da:
#9
il pezzo di codice è stato aggiunto al tuo, comunque eccolo tutto
Codice:
package csv4;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.*;

/**
*
* @author User
*/
public class CSV4 {
  public static void main(String[] args) {
      String datafile = "Rubrica.txt";
      DefaultTableModel m = null;
      /* NOTA BENE: il try-catch è un costrutto MOLTO costoso in tempi di calcolo,
       * dovuto alla gestione delle eccezioni --> INSERIRE DENTRO SOLO le istruzioni
       * che possono causare eccezioni, tutto il resto è da mettere fuory dal try
       */
      try {          
          FileReader fin = new FileReader(datafile);
          m = createTableModel(fin, null);
      } catch (Exception e) {
          e.printStackTrace();
      }
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel panel = new JPanel(); // layout del flusso è predefinito sui pannelli
      JScrollPane jsp = new JScrollPane(new JTable(m));
      // imposta una dimensione ragionevole per il pannello di scorrimento
      jsp.setPreferredSize(new Dimension(300, 150));
      panel.add(jsp); // aggiunge la tabella
      JButton button = new JButton("SALVA");
      panel.add(button); // aggiunge il bottone al pannello
      f.getContentPane().add(panel); // aggiunge il pannello che contiene sia tabella che bottone
      f.setSize(400, 300);
      f.setVisible(true);
     
      button.addActionListener(new ActionListener() {
           //@Override
           public void actionPerformed(ActionEvent e) {
           String filePath = "Rubrica.csv";
           File file = new File(filePath);
           try {
               FileWriter fw = new FileWriter(file);
               BufferedWriter bw = new BufferedWriter(fw);
           
               for(int i = 0; i < m.getRowCount(); i++){//rows
                   for(int j = 0; j < m.getColumnCount(); j++){//columns
                       bw.write(m.getValueAt(i, j).toString()+",");
                   }
                   bw.newLine();
               }
           
               bw.close();
               fw.close();
           
           } catch (IOException ex) {
//           Logger.getLogger(csv.class.getName()).log(Level.SEVERE, null, ex);
           }                
               
      }});
  }

  public static DefaultTableModel createTableModel(Reader in,
      Vector<Object> headers) {
      DefaultTableModel model = null;
      Scanner s = null;

      try {
          Vector<Vector<Object>> rows = new Vector<Vector<Object>>();
          s = new Scanner(in);

          while (s.hasNextLine()) {
              rows.add(new Vector<Object>(Arrays.asList(s.nextLine()
                                                         .split("\\s*,\\s*",
                              -1))));
          }

          if (headers == null) {
              headers = rows.remove(0);
              model = new DefaultTableModel(rows, headers);
          } else {
              model = new DefaultTableModel(rows, headers);
          }

          return model;
      } finally {
          s.close();
      }
  }
}
per quanto riguarda gli errori non ci capisco veramente un tubo, ne scrive troppi,

Edit;
hai ragione, ho risolto così:
Codice:
public class CSV4 {
  static DefaultTableModel m = null;
  public static void main(String[] args) {
Cita messaggio
Grazie da:


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)