# JList, Anzeige aktualisieren



## JLISTUser (10. Jun 2012)

Tagchen.

Ich habe hier ein JFrame.
Der Inhalt des JFrames ist eine JList sowie drei Buttons.

Ein Button ist zum hinzufügen von Elementen zur JList,
einer zum Entfernen und einer zur Bestätigung des ganzen.

Wie kann ich es realisieren, dass sobald ich ein Element 
hinzugefügt habe bzw. gelöscht habe, dass diese Änderung
auch sofort angezeigt wird?

Die Veränderungen die ich vorgenommen habe, sehe ich 
immer erst nach neustart des Programms (Die Elemente 
der Liste sind in einer Datei gespeichert).


----------



## turtle (10. Jun 2012)

Code schadet nicht


----------



## JLISTUser (10. Jun 2012)

```
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import de.fhhof.crawler.model.ListURI;

public class EditWindow implements ActionListener {
	/** */
	private JFrame frame = new JFrame("Liste der URI's");
	/** */
	private JFrame mainFrame;
	/** */
	private Buttons buttons = new Buttons();
	/** */
	private ListURI listURI = new ListURI();
	/** */
	private JList<URL> list;
	
	/**
	 * 
	 */
	public EditWindow(JFrame mainFrame) {
		this.mainFrame = mainFrame;
				
		frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		frame.setLayout(new GridLayout(2, 1));
		frame.setResizable(false);
		frame.add(panelTop());
		frame.add(panelBot());
		frame.pack();
		frame.setSize(new Dimension(300, 200));
		frame.setAlwaysOnTop(true);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
		buttons.getEditListAdd().addActionListener(this);
		buttons.getEditListDel().addActionListener(this);
		buttons.getEditListEdit().addActionListener(this);
		buttons.getEditListReset().addActionListener(this);
		buttons.getEditListOk().addActionListener(this);
	}
	
	/**
	 * 
	 * @return
	 */
	private JPanel panelTop() {
		JPanel panelTop = new JPanel();
		panelTop.setLayout(new GridLayout(1, 0));
		panelTop.add(new JScrollPane(initOutput()));
		return panelTop;
	}
	
	/**
	 * 
	 */
	private JList<URL> initOutput() {
		URL[] listData = new URL[listURI.getListURI().size()];
		
		for(int i = 0; i < listData.length; i++) {
			listData[i] = listURI.getListURI().get(i);
		}
		
		list = new JList<URL>(listData);
		list.setVisibleRowCount(10);
		
		return list;
	}
	
	/**
	 * 
	 * @return
	 */
	private JPanel panelBot() {
		JPanel panelBot = new JPanel();
		panelBot.setLayout(new GridLayout(1, 0));
		panelBot.add(buttons.getEditListAdd());
		panelBot.add(buttons.getEditListDel());
		panelBot.add(buttons.getEditListOk());
		return panelBot;
	}

	/**
	 * 
	 */
	public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(buttons.getEditListAdd())) {
			String s = (String)JOptionPane.showInputDialog(frame, "Bitte geben Sie die URL ein:", "Hinzufügen", JOptionPane.PLAIN_MESSAGE);
			
			if((s != null) && (s.length() > 0)) {
				try {
					listURI.getListURI().add(new URL(s));
					listURI.writeFile();
					
				} catch (MalformedURLException e1) {
					JOptionPane.showMessageDialog(frame, "Die eingegebene URL hat das falsche Format!", "Fehler", JOptionPane.ERROR_MESSAGE);
				}
			}
		} else if(e.getSource().equals(buttons.getEditListDel())) {
			URL temp = list.getSelectedValue();
			listURI.getListURI().remove(temp);
			listURI.writeFile();
			
		} else if(e.getSource().equals(buttons.getEditListOk())) {
			this.mainFrame.setEnabled(true);
			frame.setVisible(false);
		} 
	}
	
	// ************************************************************************************************************************************
	
	/**
	 * 
	 * @return
	 */
	public JFrame getFrame() {
		return frame;
	}
}
```


----------



## bERt0r (10. Jun 2012)

Du fügst deine neue URI zwar deiner komischen ListURI Klasse hinzu, dieses ist aber offenbar nicht soweit deiner JList das mitzuteilen. Ich vermute die Klasse de.fhhof.crawler.model.ListURI; ist kein List Model. Du musst also deine Items zusätzlich zu deiner JList hinzufügen.

How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## JLISTUser (10. Jun 2012)

Aso sorry, ich hatte vergessen, dass ich das schon rausgenommen 
hatte für die Darstellung hier im Forum.

Also ich hatte das schon probiert, meiner JList elemente hinzuzufügen
und zu entfernen, allerdings hat das nicht funktioniert.
Das ListModel der JList lies sich nicht auf DefaultListModel casten.


```
DefaultListModel listModel = (DefaultListModel)list.getModel();
```

Gab die Exception:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JList$1 cannot be cast to javax.swing.DefaultListModel

Hatte die selbe auch schon mit 

javax.swing.JList$3 statt JList$1


----------



## JLISTUser (10. Jun 2012)

Zusatzinfo wo ich das gemacht hatte:


```
public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(buttons.getEditListAdd())) {
            String s = (String)JOptionPane.showInputDialog(frame, "Bitte geben Sie die URL ein:", "Hinzufügen", JOptionPane.PLAIN_MESSAGE);
            
            if((s != null) && (s.length() > 0)) {
                try {
                    listURI.getListURI().add(new URL(s));
                    listURI.writeFile();
                    
                    DefaultListModel listModel = (DefaultListModel)list.getModel();
                    listModel.add(new URL(s));
                } catch (MalformedURLException e1) {
                    JOptionPane.showMessageDialog(frame, "Die eingegebene URL hat das falsche Format!", "Fehler", JOptionPane.ERROR_MESSAGE);
                }
            }
        } else if(e.getSource().equals(buttons.getEditListDel())) {
            URL temp = list.getSelectedValue();
            listURI.getListURI().remove(temp);
            listURI.writeFile();

            DefaultListModel listModel = (DefaultListModel)list.getModel();
            listModel.remove(new URL(s));
            
        } else if(e.getSource().equals(buttons.getEditListOk())) {
            this.mainFrame.setEnabled(true);
            frame.setVisible(false);
        } 
    }
```


----------



## bERt0r (11. Jun 2012)

Lies dir das Tutorial durch, steht alles beschrieben. Du erstellst einfach zuerst dein DefaultListModel und dann deine JList mit diesem Model. How to Use Lists (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## JLISTUser (11. Jun 2012)

Ah natürlich, klar, so funktionierts. Danke


----------

