JList Inhalt nach JButton Klick aktualisieren

Jigga

Bekanntes Mitglied
Hey Leute,

ich möchte folgendes realisieren. Ich hab eine JList mit BilderNamen in eine JScrollPane gelegt,wenn ich auf ein Element der Liste klicke öffnet sich ein bild im selben fenster neben der Liste.Die Bilder werden zuvor in eine ArrayList geladen und dann in einer Methode aus diesem ArrayList ausgelesen und zur JList hinzugefügt.Mit einem Button soll das Bild an einem bestimmten Pfad kopiert und das ursprüngliche bild gelöscht werden.
Das alles funktioniert auch bereits!
Die ArrayList wird gleich danach aktualiesiert,das funktioniert auch alles. Jedoch funktioniert folgendes nicht: nachdem die ArrayList aktualisiert wurde,will ich meine JList wieder wie zuvor gefüllt haben und dann fängts an zu hageln. Wenn ich dann versuche auf ein Element der JList zu klicken,kriege ich eine "IndexOutOfBoundExceptopn index -1". Ich verstehe einfach nicht warum mein index auf -1 gesetzt wird,habe das eigentlich ziehmlich genau so schon in einem anderen Programm realisiert und dort funktionierte das ganze wunderbar.Es war allerdings ein ButtonListener und kein MouseListener.

Java:
public class Mainframe {

	private static DefaultListModel listModel = new DefaultListModel();

	private static JList screenListe = new JList(listModel);

	private static JScrollPane screenListeScroll = new JScrollPane(screenListe);

	public static Container pane;
	
	public static JFrame mainFrame;

//mein gekürzter Frame,alle sachen,die nichts mit der JList zutun haben wurden hier entfernt!
	public static void mainScreen() {
		mainFrame = new JFrame();
		mainFrame.setTitle("HLR Ban Poster");
		mainFrame.setSize(900, 700);
		pane = mainFrame.getContentPane();
		pane.setLayout(new BorderLayout());

		JPanel pnlScreens = new JPanel();
		pnlScreens.setLayout(new GridLayout(1, 1));
		pnlScreens.setBorder(BorderFactory.createTitledBorder("Screenshots"));
		pnlScreens.add(screenListeScroll);

		
		pane.add(pnlScreens, BorderLayout.WEST);
		
		screenListeAnzeigen();

	//MouseListener der JList,der die angeklickten Bilder sichtbar macht!	
		screenListe.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				index = screenListe.getSelectedIndex();
				imageName = Settings.getScreenArray().get(index);
				pfad = Settings.pfad + "\\" + imageName;
				screen = Jimi.getImage(pfad);
				ImageIcon bild = new ImageIcon(screen);
				JLabel label = new JLabel(bild, JLabel.CENTER);
				JScrollPane sc = new JScrollPane(label);
				sc.setBorder(BorderFactory.createTitledBorder("Image"));
				pnlScreenStat.add(sc, BorderLayout.CENTER);
				mainFrame.setVisible(true);
			}
		});
//gekürzte ActionListener des erwähnten Buttons. "Settings.list();" aktuallisiert meine ArrayList.
	btnReport.addActionListener(new ActionListener() {	
			public void actionPerformed(ActionEvent reportEvent) {
					Settings.deletePic(imageName);
					Settings.list();
					screenListeAnzeigen();
					succesfull!");	
			}
		});
		
		mainFrame.setVisible(true);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
//screenListe ist meine JList. ScreenArray ist die zuvor erwähnte ArrayList.
	public static void screenListeAnzeigen() {
		screenListe.removeAll();
		listModel.removeAllElements();
		for (int i = 0; i < Settings.getScreenArray().size(); i++) {
			listModel.addElement(Settings.getScreenArray().get(i));
			screenListe.updateUI();
		}
		screenListe.updateUI();
	}

	public static void main(String[] args) {
	
}
 
Also was ich mich zu erst frage ist, wieso du nicht einfach nur removeElement o.ä. auf dem Model aufrufst, anstelle alle zu löschen und dann wieder alle hinzuzufügen?! (screenListe.removeAll(); hat übrigens nichts mit dem Model/Daten zu tun, das ist eine Methode aus Container updateUI afaik auch nicht 😀)
Dann wäre ja interessant zu wissen wo die -1 her kommt. Wahrscheinlich aber von getSelectedIndex(), das liefert nämlich -1 zurück wenn nichts selektiert wurde. Du könntest es auch mal mit einem ListSelectionListener anstelle des MouseListeners versuchen
 
Also was ich mich zu erst frage ist, wieso du nicht einfach nur removeElement o.ä. auf dem Model aufrufst, anstelle alle zu löschen und dann wieder alle hinzuzufügen?! (screenListe.removeAll(); hat übrigens nichts mit dem Model/Daten zu tun, das ist eine Methode aus Container updateUI afaik auch nicht 😀)
Dann wäre ja interessant zu wissen wo die -1 her kommt. Wahrscheinlich aber von getSelectedIndex(), das liefert nämlich -1 zurück wenn nichts selektiert wurde. Du könntest es auch mal mit einem ListSelectionListener anstelle des MouseListeners versuchen

ich habe es nicht mit dem removeElement gemacht,weil ich mir damit arbeit ersparen wollte 😀
weil ich dann ja auch aus der arraylist das element rauslöschen müsste.
und ja mit dem -1 hast du recht,wird vom selected index geliefert,wenn ich versuche ein element anzuklicken.Obwohl ein Element dann markiert ist nach dem Klick,kriege ich die -1 zurück.übrigens ist das JScrollPane in einem Label mit einem Layout,wenn das irgendwie wichtig ist.
also kann ich die mausklicks auch mit dem selection listener abfangen?
werde ich dann morgen sofort versuchen!
 
ich habe es nicht mit dem removeElement gemacht,weil ich mir damit arbeit ersparen wollte 😀
weil ich dann ja auch aus der arraylist das element rauslöschen müsste.
welche Aufgabe die ArrayList in deinem Szenario hat verstehe ich sowieso nicht. Klingt für mich irgendwie doppelt gemoppelt,. Das DefaultListModel ist ja schon, wie der Name auch sagt, ja bereits dein Model und enthält die Daten, wieso willst du zusätzlich noch ein Model/Liste halten? Bzw wenn du unbedingt deine ArrayList verwenden willst(anstelle den Vector von dem Def.ListModel), dann implementiere doch dein eigenes AbstractListModel!

übrigens ist das JScrollPane in einem Label mit einem Layout,wenn das irgendwie wichtig ist.
???:L klingt krank ;> Kannst du vllt mal dein Problem in einem kleinen Minimalbeispiel welches man auch ausführen kann aufzeigen? Mit den Komponentenbaum den du verwendest?!
also kann ich die mausklicks auch mit dem selection listener abfangen?

steht in dem Link oben :bae:
 
welche Aufgabe die ArrayList in deinem Szenario hat verstehe ich sowieso nicht. Klingt für mich irgendwie doppelt gemoppelt,. Das DefaultListModel ist ja schon, wie der Name auch sagt, ja bereits dein Model und enthält die Daten, wieso willst du zusätzlich noch ein Model/Liste halten? Bzw wenn du unbedingt deine ArrayList verwenden willst(anstelle den Vector von dem Def.ListModel), dann implementiere doch dein eigenes AbstractListModel!

hm ok ich weiß jetzt gerade selber nicht warum ich das gestern so gemacht hatte 😀
ja war doppelt,habs gefixt und nur das listModel verwendet.anschließend habe ich einfach die markierten elemente rausgelöscht und fertig.sprich das thema hat sich erledigt 🙂
war wohl doch zu spät gestern 😀

???:L klingt krank ;> Kannst du vllt mal dein Problem in einem kleinen Minimalbeispiel welches man auch ausführen kann aufzeigen? Mit den Komponentenbaum den du verwendest?!

wieso krank?mir wurde beigebracht mit panels zu arbeiten,die ich dann mit einem layout versehe und in mein pane lege ???:L
 
ja das klingt vernünftig. Hast du in deinem vorherigen Post evtl. Label mit Panel verwechselt? Naja wie auch immer, wenn es jetzt geht ist ja gut 🙂
 
Ich habe gerade ein anderes Problem!
Irgendwie kriege ich mein Bild nicht mehr angezeigt mit dem ListSelectionListener.was mache ich da falsch?
hier der code zum Listener:
Java:
//Hierbei wird der index des selektierten Elements aus einer JList ausgelesen.Die Liste ist mit den
//Namen der Bilder gefüllt.Also hole ich mir den Namen und baue mir den Pfad zu dem bild (der zuvor
//schon bestimmt wurde!).Anschließend hole ich mir das bild,wie im Internet nachgelesen mit der
//"getImage" Methode und lege das ganze in ein ImageIcon.Dieses wird anschließend  in ein label
//geladen,das in einem JScrollPane liegt.Das Scrollpane liegt in einen anderen label,das ein
//BorderLayout besitzt.Dieses habe ich in das ContentPane gelegt.Jedoch sehe ich leider kein bild beim
//klick.
	private class ListListener implements ListSelectionListener {
	    public void valueChanged(ListSelectionEvent e) {
	    	if (e.getValueIsAdjusting())
	          	index = imageListe.getSelectedIndex();
		        imageName = listModel.get(index).toString();
		        pfad = Settings.pfad + "\\" + imageName;
	        	screen = Jimi.getImage(pfad);
	        	bild = new ImageIcon(screen);
	        	lblImage = new JLabel(bild);
	        	lblImage.updateUI();
	        } 
	    {
	    
	    }
	}
	public static void main(String[] args) {
		new Hauptfenster();

	}	
}

ja das klingt vernünftig. Hast du in deinem vorherigen Post evtl. Label mit Panel verwechselt? Naja wie auch immer, wenn es jetzt geht ist ja gut 🙂

Nein nicht das ich wüsste.Labels wurden bei uns als eine art "Flächentagfeln" für zB Text genutzt und Panels als eine Art Container in den man alles reinlegt usw.
 
Zuletzt bearbeitet:
Naja so kann man da jetzt wenig zu sagen. Überprüfe halt ob der Pfad auch wirklich stimmt (z.B. mit new File(...).exists())
Bzw. was ist Settings.pfad ?
Und eben, vor deinem Edit hattest du auch etwas mit jar geschrieben, sind die Bilder mit im jar? Dann solltest du die Forensuche mal bemühen, wie man Bilder lädt findet man hier sehr häufig 🙂
 
Naja so kann man da jetzt wenig zu sagen. Überprüfe halt ob der Pfad auch wirklich stimmt (z.B. mit new File(...).exists())
Bzw. was ist Settings.pfad ?
Und eben, vor deinem Edit hattest du auch etwas mit jar geschrieben, sind die Bilder mit im jar? Dann solltest du die Forensuche mal bemühen, wie man Bilder lädt findet man hier sehr häufig 🙂
also die bilder existieren und der pfad wird auch richtig ausgelesen.Mit "Settings.pfad" hole ich mir den pfad,der vorher definiert wurde.Irgendwie haperts am übergeben an das JLabel.
Das zum davor geschriebenen hat sich bereits erledigt 🙂


EDIT: Ok hab die funtkion "label.setIcon()" gefunden,hat sich somit erledigt 😀
danke für die hilfe
 
Zuletzt bearbeitet:

Zurück
Oben