JList aktualisieren nach Dateneingabe funktioniert nicht

Geoschnute

Grünschnabel
Hallo zusammen,

ich habe folgendes Problem. Ich hab von meiner Dozentin eine Aufgabe bekommen.
Unzwar geht es darum ein Miniprogramm zu erstellen, das im Startfenster ein Label, vier Buttons und und eine JList beinhaltet.

Über einen JDialog sollen Daten eingegeben werden können, die danach in eine Datei geschrieben werden und von dort aus wieder ausgelesen werden können und danach in der JList erscheinen.

Soweit so gut. Schreiben und Lesen funktioniert auch wunderbar nur wenn ich neue Datensätze eingeb wird die JList nicht aktualisiert, die neue Liste mit den neuen Werten wird zwar erzeugt (Hab ich mir ausgeben lassen), nur ersetzt er die alte Liste nicht.

Ich sitze an diesem Problem jetzt bereits zwei Tage( ich lern noch nich lange Java ;) )
und weiß mir nicht mehr zu helfen.
Es wär echt toll wenn mir jemand helfen könnte!

Diese Klasse ist für das Hauptfenster verantwortlich (wird über einen Master aufgerufen):
Code:
...
public class Ansicht extends JFrame 
                    implements ActionListener, ListSelectionListener {
    JButton bEinfuegen;
    JButton bBearbeiten;
    JButton bLoeschen;
    JButton bSchliessen;
    
	GridBagLayout gL		=  new GridBagLayout( ) ;
	Container contentPane	= getContentPane();
	GridBagConstraints c = new GridBagConstraints( ) ;

	DefaultListModel model = new DefaultListModel();
	
	JLabel label = new JLabel("Versicherte");
	
	static Ansicht oMasterAnsicht	= null;
	
	static Ansicht getInstance() {
		if(oMasterAnsicht == null) {
			oMasterAnsicht	= new Ansicht();
		}
		return oMasterAnsicht;
	}

	public Ansicht() {
		super("Versicherungsprogramm");
		//showPane();
	}
	
	public void showPane() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        contentPane.setLayout(gL);
		bEinfuegen				= new JButton("Einfügen");
		bSchliessen				= new JButton("Schließen");
	//--------------------------------------------------------
		bBearbeiten		= new JButton("Bearbeiten");
		bLoeschen		= new JButton("Löschen");

		JList oList = new JList(model);
		oList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		oList.addListSelectionListener(this);
		createList(oList);
		
	//---------------------------------------------------------	
		
		c.fill = GridBagConstraints.BOTH ;
		c.insets   = new Insets(12, 12, 12, 12);
		
		bEinfuegen.addActionListener(this);
		bBearbeiten.addActionListener(this);
		bLoeschen.addActionListener(this);
		bSchliessen.addActionListener(this);
	//-------------------------------------------
		c.insets   = new Insets( 12, 12, 12, 12 );
		
		c.gridheight = 1;
		c.gridwidth = 1;
		c.gridx    = 0;
		c.gridy    = 0;
		add(label,c);
		
		c.gridx    = 2;
		c.gridy    = 1;
		contentPane.add(bEinfuegen, c);

		c.gridx    = 0;
		c.gridy    = 1;
		c.gridheight = 6;
		c.gridwidth = 2;
		c.weightx    = 10;
		//contentPane.add(oList,c);
		contentPane.add(new JScrollPane(getOList(),
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), c);
		
		
		c.weightx    = 0;
		c.gridheight = 1;
		c.gridwidth = 3;
		c.gridx    = 2;
		c.gridy    = 3;
		contentPane.add(bBearbeiten,c);
		
		c.gridy    = 4;
		contentPane.add(bLoeschen,c);
		
		c.gridy    = 5;
		contentPane.add(bSchliessen,c);
	     //--------------------------------------------  --
		pack();
		setSize(400,300);
		setLocation(300,400);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
    	if(e.getSource() == bEinfuegen) {
    		DialogWindow dialog = new DialogWindow(this, "Einfügen");
			dialog.setVisible(true);
		} else if(e.getSource() == bBearbeiten) {
			// bearbeiten();
		} else if(e.getSource() == bLoeschen) {
			
		} else if(e.getSource() == bSchliessen) {
			System.exit(0);
		}
    }
    
    public void createList(JList oList) {
    	DefaultListModel model = (DefaultListModel)oList.getModel();
		model.removeAllElements();
		
		List<Object> oDataList		= new ArrayList<Object>();
	    String sRecord;
	    String[] aRecords = null;
		
	    HandleData oHandleData		= new HandleData();
		oDataList					= oHandleData.readContent();
		
		Iterator iter = oDataList.iterator();
		int i	= 0;
		while(iter.hasNext() ) {
		    Object oData = iter.next();
		    sRecord					= oData.toString();
		    aRecords				= sRecord.split("\t", 2);
		    model.addElement(aRecords[0] + " , " + aRecords[1]);
		    i++;
		}
		model.addElement(aRecords[0] + " , " + aRecords[1]);
		//showPane();
    }
    
	public JList getOList() {
		return oList;
	}

	public void setOList(JList list) {
		oList = list;
	}
.....
Hier die Klasse die für den Dialog verantwortlich ist:
Code:
public class DialogWindow extends JDialog implements ActionListener {

	private static final long serialVersionUID = -5836095604842076439L;
	JButton bOk;
	JButton bAbbrechen;
	String sInputId						= "0";
	String sInputVorname				= null;
	String sInputNachname				= null;
	GridBagConstraints c				= new GridBagConstraints( ) ;
	JTextField oInputId					= new JTextField("-1");
	JTextField oInputVorname			= new JTextField();
	JTextField oInputNachname			= new JTextField();
	
	public DialogWindow(){};
	
	public DialogWindow(Ansicht ansicht, String string) {
		super(ansicht, string, true);
		this.progressMethod();
	}
	
	public void progressMethod() {
		
		GridBagLayout dL				= new GridBagLayout();
		Container contentPane			= getContentPane();
		contentPane.setLayout(dL);
		// ------------------------------------------------------------
		bOk								= new JButton("Ok");
		bAbbrechen						= new JButton("Abbrechen");
		JLabel label					= new JLabel("Neuen Versicherten anlegen");
		JLabel oLabelVorname			= new JLabel("Vorname");
		JLabel oLabelNachname			= new JLabel("Nachname");
		
		// ------------------------------------------------------------		
		// GridBagConstraints c			= new GridBagConstraints( ) ;
		c.fill							= GridBagConstraints.BOTH ;
		c.insets						= new Insets(10, 10, 10, 10);
		// ------------------------------------------------------------
		bOk.addActionListener(this);
		bAbbrechen.addActionListener(this);
		// ------------------------------------------------------------
		//Labels
		c.insets  						= new Insets(5, 5, 5, 5);
		c.gridheight					= 1;
		c.gridwidth						= 2;
		c.gridx   						= 0;
		c.gridy    						= 0;
		add(label, c);

		c.gridheight					= 1;
		c.gridwidth						= 1;
		c.gridx							= 0;
		c.gridy							= 1;
		add(oLabelVorname, c);
		
		c.gridheight					= 1;
		c.gridwidth						= 1;
		c.gridx							= 0;
		c.gridy							= 2;
		add(oLabelNachname, c);
		
		c.gridx							= 1;
		c.gridy							= 1;
		contentPane.add(oInputVorname, c);

		c.gridx							= 1;
		c.gridy							= 2;
		contentPane.add(oInputNachname, c);
		
		// Buttons
		c.gridx							= 0;
		c.gridy							= 3;
		contentPane.add(bOk, c);
		
		c.gridx							= 1;
		c.gridy							= 3;
		contentPane.add(bAbbrechen, c);
		// ------------------------------------------------------------

		// ------------------------------------------------------------
		pack();
		setLocation(200, 200);
	}
	
	public void fillData(int iId) {
		if(iId < 0)
			JOptionPane.showMessageDialog(null, "Keinen Datensatz ausgewählt, neuer Datensatz wird angelegt");
		HandleData oHandleData	= new HandleData();
		List<Object> oDataList	= oHandleData.readContent();
		Iterator iter = oDataList.iterator();
		String sRecord;
		String[] aRecords;
		int i	= -1;
		while(iter.hasNext() ) {
			i++;
		    Object oData = iter.next();
		    if(iId != i) continue;
		    sRecord					= oData.toString();
		    aRecords				= sRecord.split("\t", 2);
		    oInputId				= new JTextField("" + i);
		    oInputVorname.setText(aRecords[0]);
			oInputNachname.setText(aRecords[1]);
		}
	}
	public void deleteData(int iId) {
		if(iId < 0)
			JOptionPane.showMessageDialog(null, "Keinen Datensatz ausgewählt");
		HandleData oHandleData	= new HandleData();
		List<Object> oDataList	= oHandleData.readContent();
		Iterator iter = oDataList.iterator();
		String sRecord;
		String[] aRecords;
		int i	= -1;
		while(iter.hasNext() ) {
			i++;
		    Object oData = iter.next();
		    if(iId != i) continue;
		    sRecord					= oData.toString();
		    aRecords				= sRecord.split("\t", 2);
		    
		}
	}

	public void actionPerformed(ActionEvent e) {
		 try {
			 if(e.getSource() == bAbbrechen) {
				 setVisible(false);
				 dispose();
			 } else if(e.getSource() == bOk) {
				 try {
					setCustomerData();
					
					Ansicht oAnsicht	= new Ansicht();
					DefaultListModel model = new DefaultListModel();
					JList list			= new JList(model);
					oAnsicht.setOList(list);
					oAnsicht.createList(list);
				 } catch(IOException e1) {
					 e1.printStackTrace();
				 }
			 }
		 } catch(NullPointerException e2) {
			 JOptionPane.showMessageDialog(null, e2);
		 }
    }
	
	public int setCustomerData() throws IOException {
		try {
			sInputId							= oInputId.getText();
			sInputVorname						= oInputVorname.getText();
			sInputNachname						= oInputNachname.getText();
			
			String[] aRecord					= {sInputVorname, sInputNachname};
			
			int iId								= Integer.parseInt(sInputId);
			HandleData oData					= new HandleData();
			oData.saveData(aRecord, iId);
			setVisible(false);
			dispose();
			return iId;
			
			
		} catch(Exception e) {
			JOptionPane.showMessageDialog(null, e);
		}
		return 0;
	}

}
und hier die Klasse die schreibt und liest:
Code:
public class HandleData {
	String sWriteContent			= null;
	int iLineNumber					= -1;
	String sLine					= null;
	String sFileContent				= null;
	String[] aFileContent			= null;
	File oFile						= new File("data.txt");
	String sRecords;
	List<Object> oDataList			= new ArrayList<Object>();
	
	public List<Object> readContent() {
		try {
			List<Object> oDataList	= new ArrayList<Object>();
			BufferedReader oIn		= new BufferedReader(new FileReader(oFile));
			LineNumberReader oLin	= new LineNumberReader(oIn);
			int iRowNumber			= 0;
			while((sRecords = oLin.readLine()) != null) {
				iLineNumber		= iRowNumber + 1;
				try {
					oDataList.set(iRowNumber, sRecords);
				} catch(IndexOutOfBoundsException e) {
					oDataList.add(sRecords);
				}
				iRowNumber++;
			}
			oLin.close();
			return oDataList;
		} catch(FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Datei " + oFile + "konnte nicht gefunden werden");
		} catch(IOException e1) {
			e1.printStackTrace();
		} catch(NullPointerException e3) {
			JOptionPane.showMessageDialog(null, sRecords);
		}
		return oDataList;		
	}
	
	public void writeContent(List oDataList) throws IOException {
		/*
		 * Eingabewerte werden aus Dialogfenster werden übergeben
		 * und ein Datei geschrieben
		 */
		Writer oFileWriter		= new FileWriter(oFile, false);
		PrintWriter oWriteData 	= new PrintWriter(oFileWriter);
        Iterator iter = oDataList.iterator();
        while(iter.hasNext() ) {
            Object oData = iter.next();
            oWriteData.println(oData);
        }
        oWriteData.close(); 
	}

	public void saveData(String[] aRecord, int iId) throws IOException {
		oDataList			= this.readContent();
		if(iId > -1) {
			oDataList.set(iId, aRecord[0] + "\t" + aRecord[1]);
		} else {
			oDataList.add(aRecord[0] + "\t" + aRecord[1]);
		}
		this.writeContent(oDataList);

	}
}

Ich weiß es ist ganz schön viel Code ich wusste nur leider nicht was ich rauslassen kann, sodass man den Fehler trotzdem findet...

Vielen Dank schon mal im Voraus :)
 
Hi,

erstmal herzlich Willkommen bei tutorials.de :)


aber bevor ich deine Frage versuche zu beantworten, zuerst mal 2 Kleinigkeiten, welche mir an deinen Post nicht gefallen:

1. Schreibe bitte deinen JavaCode in [ java] [/ java] klammern, so hat man auch Syntaxhighlightning ;)
2. Bitte komplett lauffähige Beispiele posten. Du hast zwar verdammt viel Source gepostet, aber ich habs innerhalb von ner halben Stunde immer noch nicht am laufen.

Entschuldige bitte, dass ich gleich mal mit der Kritik anfange, aber das Probieren hat mich schon ein bisschen genervt ;)

Also, einfach mal ein Schuss ins Blaue, ich kanns nicht testen:
1. Möglichkeit: Versuche mal die JListe auszublenden, die Daten zu aktualisieren, und dann wieder einzublenden

2. Möglichkeit: Entferne die JList komplett vom Frame, instanziere eine neue und füg die wieder hinzu.

Gruß
BK
 
Code:
DefaultListModel model = (DefaultListModel)oList.getModel();

Nimm mal die Zeile raus und versuch, ob es dann geht. (steht bei dir in createList)

showPane() hast du zwar in createList() auskommentiert, aber das würde ich ganz wegmachen, weil so wie ich das sehe würdest du sonst in eine Endlosschleife kommen, wiel die sich gegenseitig aufrufen! Und sowas sieht auch auskommentiert nicht gut aus *zwinker*

Java:
contentPane.add(new JScrollPane(getOList(),
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), c);

Deine oList kennt dein Programm doch aber nur in showPane(), woher soll getOList() deine oList nehmen?
 
Zuletzt bearbeitet:
Erstmal dankeschön für die Antworten :)

Das hier war das erste Mal, dass ich ne Frage in einem Forum gestellt habe, beim nächsten Mal poste ich den ganzen Code :)

Und das auskommentierte showPane() erzeugt wirklich eine Endlosschleife;-)

Mittlerweile habe ich doch noch eine Lösung gefunden. Das Problem war, das ich die Ansicht-Klasse immer über ein neues Objekt ( beim OK-Klick im Dialogfenster) aufgerufen habe, was ein neues Fenster erzeugt, jetzt ist es statisch und alles funktioniert wunderbar!


Vielen Dank für die Mühe!
 
Zurück