# ListSelectionListener + index?



## raffnix (1. Mai 2005)

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??


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

 :?:  :?:


----------



## Roar (1. Mai 2005)

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


----------



## raffnix (1. Mai 2005)

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 (1. Mai 2005)

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 (1. Mai 2005)

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)


```
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 (1. Mai 2005)

> 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 (1. Mai 2005)

Was sind in der Liste denn für Element drin?

```
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: 

```
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 (1. Mai 2005)

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.

```
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?


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


----------



## mic_checker (1. Mai 2005)

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.


----------



## Roar (1. Mai 2005)

überprüf halt vorher ob index != -1 ist


----------



## raffnix (1. Mai 2005)

hm ok..

```
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.


```
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 (1. Mai 2005)

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


----------



## raffnix (1. Mai 2005)

Also.
@mic.


> Benutzt du einen Button oder was genau benutzt du um "aus dem Index auf ein Image zu kommen"?



nee das passier alles in dem List Listener..

@wildcard.


> überprüf halt vorher ob index != -1 ist



habe es mit:
list.setSelectedIndex(0);

ausgeschlossen


----------



## raffnix (1. Mai 2005)

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


----------



## Wildcard (1. Mai 2005)

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?
> ...


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 (1. Mai 2005)

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


```
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


----------

