ListSelectionListener + index?

Status
Nicht offen für weitere Antworten.

raffnix

Bekanntes Mitglied
Hallo !
Ich versuche bilder aus einer JList anzeigen zu lassen.
Nun habe ich ein problem aus dem selectedIndex auf ein Image oder einen String zu kommen.
Hab ich vielleicht die sache falsch angefangen??

Code:
list.addListSelectionListener(new ListSelectionListener(){
	  	
	  	public void valueChanged(ListSelectionEvent e)
	  	  {
            JList source = (JList)e.getSource();
            if (source.getValueIsAdjusting())
               return;
           int index = source.getSelectedIndex();
           //??????
	     }
	  	});

:?: :?:
 
R

Roar

Gast
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JList.html#getSelectedValue()
 

raffnix

Bekanntes Mitglied
das habe ich auch schon gesehen.
so bekomme ich dann ja ein Objekt.

liefert mir denn .toString() einen String mit dem ich auch was anfangen kann??
 

raffnix

Bekanntes Mitglied
Ja das tut sie.
so klappt es wunderbar.
Dankeschön der link auf die API hat meine bedenken und unsicherheit zerstreut.
manchmal ist ein link genug der Worte.
:applaus:
 

raffnix

Bekanntes Mitglied
Hmmm grrrrr
das wohl etwas voreilig . so ganz klappt es dann doch nicht.
das mit to string ist nicht ganz das richtige schätz ich.oder doch?
was hab ich falsch gemacht? bekomme folgenden fehler:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at smile.Joda$2.valueChanged(Joda.java:107)

Code:
list.addListSelectionListener(new ListSelectionListener(){
	  	
	  	public void valueChanged(ListSelectionEvent e)
	  	  {
            JList source = (JList)e.getSource();
            if (source.getValueIsAdjusting())
               return;
           int index = source.getSelectedIndex();
           Object dat = new Object();
           dat = source.getSelectedValue();
           String path = dat.toString(); // Zeile 107
           File bild = new File(path);
           ImageIcon icon = new ImageIcon(bild.getAbsolutePath());
           if(bildpanel != null)
           	getContentPane().remove(bildpanel);

           bildpanel = new ImagePanel(icon.getImage());
           getContentPane().add(bildpanel, BorderLayout.CENTER);
	     }
	  	});
 

mic_checker

Top Contributor
public Object getSelectedValue()

Returns the first selected value, or null if the selection is empty.
Hast du auch was markiert in der Liste? Hab mir deinen Code sonst nicht angeguckt, aber wenn nichts markiert ist gibt es null zurück.
 

Wildcard

Top Contributor
Was sind in der Liste denn für Element drin?
Code:
           Object dat = new Object(); 
           dat = source.getSelectedValue();
Wenn du dat anschließend sowieso den selectedValue zuweist brauchst du vorher kein Object erzeugen.
new Object() ist wohl eh ziemlich nutzlos :wink:
Code:
           if(bildpanel != null) 
              getContentPane().remove(bildpanel); 

           bildpanel = new ImagePanel(icon.getImage()); 
           getContentPane().add(bildpanel, BorderLayout.CENTER);
Wenn ich das richtig verstehe willst du irgendein Bild anzeigen?
Keine gute Lösung ein Panel zu entfernen und dann ein neues zu erzeugen...
Verändere einfach das alte.
 

raffnix

Bekanntes Mitglied
Ja schon.
beim Start werden zwei jpgs in der liste gezeigt.
wenn ich sie anklicke passiert garnix.

Ich lade die liste durch einen JFileChooser neu und dann kommt der Fehler.
Code:
datei.addActionListener(new ActionListener(){
    	
    	public void actionPerformed(ActionEvent e){
    		//nur Ordner auswählen und inhalt in die Liste
          chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
          chooser.showOpenDialog(null);   
          file =chooser.getSelectedFile();
          listdata.clear();
          File[] files = file.listFiles();
  		for(int i =0;i<files.length;i++)
  			listdata.addElement(files[i]);
  		//list.setSelectedIndex(0);
    	}
    });
hier ist der code für das neu Füllen der Liste und den FileChooser .
glaube zwar nicht das es an dem liegt aber das dier fehler gerade dann kommt ist schon seltsam.

@ Wildcard
ich wähle einen ordner wo 2 jpgs drin sind.

meinst du so?

Code:
if(bildpanel != null)
           bildpanel=null;
           bildpanel = new ImagePanel(icon.getImage());
           getContentPane().add(bildpanel, BorderLayout.CENTER);
 

mic_checker

Top Contributor
Selbst wenn Daten in der Liste drin sind muss erst ein Element markiert sein....

Nun habe ich ein problem aus dem selectedIndex auf ein Image oder einen String zu kommen.
Benutzt du einen Button oder was genau benutzt du um "aus dem Index auf ein Image zu kommen"?

ps. kannst du mal den kompletten Code posten ? Dann kann man es testen.
 

raffnix

Bekanntes Mitglied
hm ok..
Code:
package smile;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Joda extends JFrame {
	File file = new File("Pics"); // ein ordner mit 2 jpgs drin
	 JList list;
	 JPanel jListPanel;
	 JFileChooser chooser = new JFileChooser();
	 ImagePanel bildpanel= null;
	 
	 DefaultListModel listdata;
	public Joda(){
		
		listdata = new DefaultListModel();
		 
		//daten für das ListModel vorbereiten und einfügen
		File[] files = file.listFiles();
		for(int i =0;i<files.length;i++)
			listdata.addElement(files[i]);	
		
		//JList einrichten
		list = new JList(listdata);				
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//list.setSelectedIndex(0);
		//JList mit scroll ausstatten
        JScrollPane scrollist= new JScrollPane(list);		
		//Panel für die liste erstellen und in die Gui rein
        jListPanel = new JPanel(new BorderLayout(5, 5));		
		jListPanel.add(scrollist);
		jListPanel.revalidate();   		
		getContentPane().add(jListPanel,BorderLayout.EAST);

        scrollist.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
 
	//Menü erstellen und einfügen	
    JMenuBar menubar = new JMenuBar();	
	setJMenuBar(menubar);
	JMenu m = new JMenu("File");
	menubar.add(m);
	JMenuItem datei = new JMenuItem("Open..");
	m.add(datei);
	

	   //Hier passiert was....
	 datei.addActionListener(new ActionListener(){
    	
    	public void actionPerformed(ActionEvent e){
    		//nur Ordner auswählen und inhalt in die Liste
          chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
          chooser.showOpenDialog(null);   
          file =chooser.getSelectedFile();
          listdata.clear();
          File[] files = file.listFiles();
  		for(int i =0;i<files.length;i++)
  			listdata.addElement(files[i]);
  		//list.setSelectedIndex(0);
    	}
    });
	 
	  list.addListSelectionListener(new ListSelectionListener(){
	  	
	  	public void valueChanged(ListSelectionEvent e)
	  	  {
            JList source = (JList)e.getSource();
            if (source.getValueIsAdjusting())
               return;
           int index = source.getSelectedIndex();
           Object dat = source.getSelectedValue();
           String path = dat.toString();
           File bild = new File(path);
           ImageIcon icon = new ImageIcon(bild.getAbsolutePath());
           
           if(bildpanel != null)
           	getContentPane().remove(bildpanel);
           bildpanel=null;
           bildpanel = new ImagePanel(icon.getImage());
           getContentPane().add(bildpanel, BorderLayout.CENTER);
	     }
	  	});	  
	  
      
      
      jListPanel.revalidate();      
	           
	      
	       	           
	  setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
	  setSize(800, 600);
	  setLocation(100, 100);
	  setVisible(true);
	  
	  
	}
	
	

	public static void main(String[] args){
		new Joda();
	}
	}

falls ihr es testen wollt braucht ihr noch diese class.

Code:
ackage smile;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

public class ImagePanel extends JPanel{
	private Image image;
	public ImagePanel(Image image){
	this.image = image;
	
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.drawImage(image, 0, 0,image.getWidth(this),image.getHeight(this),this);
	}
	public Dimension getPreferredSize(){
		return new Dimension(image.getWidth(this),
				image.getHeight(this));
		
	}
}

wenn der LisSelectionListener wegkommentiert wird seht ihr auch das die JList funzt.
 

mic_checker

Top Contributor
wie gesagt, überprüf einfach ob ein Element selektiert wurde , entweder den Rückgabewert von getSelecteValue() oder der von getSelectedIndex().
 

raffnix

Bekanntes Mitglied
eigentlich benutz ich den Index gar nicht mehr sehe ich gerade.
habe es ja mit getSelectedValue() gemacht.
 

Wildcard

Top Contributor
Und genau dieser selectedValue kann eben auch null sein...
rafnix hat gesagt.:
@ Wildcard
ich wähle einen ordner wo 2 jpgs drin sind.

meinst du so?

Code:
if(bildpanel != null) 
           bildpanel=null; 
           bildpanel = new ImagePanel(icon.getImage()); 
           getContentPane().add(bildpanel, BorderLayout.CENTER);
Nein, damit meine ich du solltest deinem bildPanel ein neues Icon setzen, anstatt ein komplett neues Panel zu erzeugen.
Mit 'new' muss man sehr sparsam umgehen...
 

raffnix

Bekanntes Mitglied
also hab das mal mit dem index überprüft,

Code:
int index = source.getSelectedIndex();
           System.out.print(index);

wenn ich selectiere schmeißt er auch den passenden Index aus..
zumindest bei der errsten JList ( ohne JFileDialog erzeugt)

ja
das bekomm ich noch hin mit dem panel
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
J Swing MVC-Beispiel unklar(ListSelectionListener und ListDataListener) AWT, Swing, JavaFX & SWT 2
C ListSelectionListener wird mehrfach initialisiert AWT, Swing, JavaFX & SWT 4
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
D Swing Tabellen-Namen im ListSelectionListener abfragen AWT, Swing, JavaFX & SWT 2
T JList / ListSelectionListener / sehr eigenartig AWT, Swing, JavaFX & SWT 11
M JTable und ListSelectionListener Problem AWT, Swing, JavaFX & SWT 3
M ListSelectionListener wird doppelt durchlaufen AWT, Swing, JavaFX & SWT 4
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
J index im Array aussuchen AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
S JList Index finden AWT, Swing, JavaFX & SWT 6
L JTableModel - Zeilen mit eigenem Index ausstatten AWT, Swing, JavaFX & SWT 4
W Swing Bei einem 2-dimensionalen array, bei mouseClicked index zuordnen AWT, Swing, JavaFX & SWT 2
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L Swing JTabbedPane - Index vom Tab AWT, Swing, JavaFX & SWT 3
Iron Monkey JPopupMenu/JMenuItem Index für getSubElements()[] ermitteln AWT, Swing, JavaFX & SWT 8
V JComboBox gleicher Inhalt bedeutet gleicher Index? AWT, Swing, JavaFX & SWT 7
P JList Index Ändern Problem AWT, Swing, JavaFX & SWT 4
F An eindeutigen Index eines Tabs in einer JTabbed Pane kommen AWT, Swing, JavaFX & SWT 3
V Vector->TableModel->RowSorter:Bei Markierung Index im AWT, Swing, JavaFX & SWT 2
I JList scrollt nicht zum selektierten Index AWT, Swing, JavaFX & SWT 2
P 2 Probleme mit Panel: index setzten und transparenz AWT, Swing, JavaFX & SWT 4
D JTextFields in Vektor: index auslesen AWT, Swing, JavaFX & SWT 10
P JList: Ausgewählten Index anzeigen AWT, Swing, JavaFX & SWT 6
M jLabel per Index ansprechen? AWT, Swing, JavaFX & SWT 8
Student Drag & Drop: Index nach verschieben herausfinden AWT, Swing, JavaFX & SWT 3
sliwalker MouseEvent,JKomponente aus Array: Wie bekommt man den Index AWT, Swing, JavaFX & SWT 2
M Index von verschobenen Spalten (JTable) AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben