2016-05-24 11 views
1

Hey Leute, die ich meine Aufgabe und jetzt habe ich das Problem mit nicht bearbeitbaren Zellen, tatsächlich wurde es editierbar, aber das Ergebnis der Bearbeitung nicht auf Arraylist eingestellt, habe ich viele versucht Lösung aus dem Internet, aber es funktioniert nicht. Also meine Arbeit wie Registrierungssystem, die Informationen über Gast erhalten, und dann in der CSV-Datei gespeichert. In der zusätzlichen Funktion muss das Programm Anzeige-, Update-, Lösch- und Suchfunktion haben.Wie man Spalten in speziellen abstrakten Modell bearbeitbar machen JTable

Ich beendete alles, ohne zu aktualisieren, zu löschen und zu suchen. Kannst du bitte meinen Code suchen und mir helfen oder den Ratschlag, Link oder etwas Nützliches geben.

das ist mein abstraktes Modell:

public class ddispmodel extends AbstractTableModel { 
private final String[] columnNames = { "FirstName", "SecondName", "Date of              
birth", "Gender", "Email", "Address", "Number", "Attending","ID" }; 
private ArrayList<String[]> Data = new ArrayList<String[]>(); 
private boolean editable; 


public void AddCSVData(ArrayList<String[]> DataIn) { 
    this.Data = DataIn; 
    this.fireTableDataChanged(); 
} 

@Override 
public int getColumnCount() { 
    return columnNames.length;// length; 
} 

@Override 
public int getRowCount() { 
    return Data.size(); 
} 

@Override 
public String getColumnName(int col) { 
    return columnNames[col]; 
} 

@Override 
public Object getValueAt(int row, int col) { 
    return Data.get(row)[col]; 
} 
public boolean isCellEditable(int row, int col) { 
    setValueAt(Data, row, col); 
    this.fireTableCellUpdated(row, col); 
    return true; 
} 
} 

Dieser Teil meiner Hauptklasse ist Es ist Aktion Listener der Hexenmenüpunkt Funktion aktivieren Anzeige (ich nicht alle Klasse kopiert haben, weil es fast 1000 Linien, aber wenn es nötig, kann ich alle Codes)

dlog.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e){ 
     CSVFileDomestic Rd = new CSVFileDomestic(); 
     ddispmodel ddispm = new ddispmodel(); 
      ddisp.setModel(ddispm); 
      File DataFile = new File("D:\\cdne4\\WorkPlace\\Domestic.csv"); 
      ArrayList<String[]> Rs2 = Rd.ReadCSVfile(DataFile); 
      ddispm.AddCSVData(Rs2); 
      System.out.println("Rows: " + ddispm.getRowCount()); 
      System.out.println("Cols: " + ddispm.getColumnCount()); 

     cl.show(cp, "dispDomPanel"); 
    } 
    }); 

und File-Klasse einreichen, das Datum von csv umwandeln zu Arraylist

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Arrays; 

public class CSVFileDomestic { 
     private final ArrayList<String[]> Rs = new ArrayList<String[]>(); 
     private String[] OneRow; 

     public ArrayList<String[]> ReadCSVfile(File DataFile) { 
      try { 
       BufferedReader brd = new BufferedReader(new    
      FileReader(DataFile));  
      while (brd.ready()) { 
        String st = brd.readLine(); 
        OneRow = st.split(","); 
        Rs.add(OneRow); 
        System.out.println(Arrays.toString(OneRow)); 
       } 
      } 
      catch (Exception e) { 
       String errmsg = e.getMessage(); 
       System.out.println("File not found:" + errmsg); 
      } 
      return Rs; 

: Ich bin Java und dies ist mein erstes Programm, bitte können Sie erklären, leichter

Antwort

2

aber das Ergebnis der Bearbeitung nicht auf Arraylist gesetzt,

Sie außer Kraft setzen müssen die setValueAt(...) Methode des TableModel zum Speichern der Daten.

Es wäre so etwas wie:

String[] row = data.get(row); 
row[column] = value; 
this.fireTableCellUpdated(row, col); 

Auch die isCellEditable(...) Verfahren eine Verarbeitung nicht tun sollten. Es gibt einfach wahr/falsch für die gegebene Spalte zurück. Wenn Sie möchten, dass alle Spalten editierbar sind, dann sollte es einfach sein:

public boolean isCellEditable(int row, int col) { 
    //setValueAt(Data, row, col); 
    //this.fireTableCellUpdated(row, col); 
    return true; 
} 
+0

Vielen Dank für Ihre Antwort, ich versuchte, wie dies vor, und ich erhielt Fehler wie Zeile - ist doppelte Variable und die Methode .get () ist nicht anwendbar für Arraylist –

+0

'row - ist doppelte Variable' - Ja, das ist offensichtlich ein Fehler meinerseits. Nehmen Sie sich Zeit, um das Konzept des Codes zu verstehen und geben Sie der Variablen einen anderen Namen. 'die Methode .get() ist nicht anwendbar für Arraylist' - wenn Sie das erste Problem beheben, sollte das zweite Problem weggehen.Auch wenn "row" eine doppelte Variable ist, weiß der Compiler nicht, wie er die Anweisung auflösen soll, da er nicht weiß, was der richtige Datentyp von "row" ist. – camickr

0

Ich beende das)) und gehe, um andere Optionen zu tun. camickr danke für Hilfe, Sie geben mir den Weg, der mich zur Antwort bringen)) Ich verbringe fast 6 Stunden für den Versuch, es zu tun und endlich habe ich es. Wenn jemand interessant, Antwort ist

public boolean isCellEditable(int row, int col) { 
    return true; 
} 
@Override 
public void setValueAt(Object aValue, int row, int col){ 
    Data.get(row)[col]= (String) aValue; 
    fireTableCellUpdated(row,col); 

so dass ich nur neue Methode setValueAT machen, die mir sagte camickr. als ich ging zu Oracle-Site und lesen Sie darüber, und nach dem Versuch es zu tun, aber es nicht, weil aValue kann nicht von Objekt in String konvertiert werden, und schließlich initiiere ich aValue als String, so jetzt es funktioniert.Allerdings ist es nicht alles, es ändert nur Arraylist. Braucht neue Methode um Arraylist in CSV-Datei zu konvertieren. Ich arbeite jetzt daran, vielleicht nachdem ich es zeigen werde. Entschuldigung für meine Theorie, ich bin neu in Java, nur lernen, wie es funktioniert))