# Auslesen der JList



## babaganoush (20. Mai 2008)

Weiß vielleicht jemand einen Rat für mich?  

das Problem an der Sache ist, dass in dieser JList in einer Zeile mehrere Sachen eingetragen sind, die sauber getrennt ausgelesen werden sollen (wichtig ist halt, dass sie nachher noch dem Index zugeordnet werden können):

```
((DefaultListModel) liste.getModel()).addElement(combo.getSelectedItem()
					+ "          " + t.getText() + " m" + "          " + t2.getText())
```

demnach möchte ich einen String erstellen für "combo.getSelectedItem()" und 2 Doubles für "t.getText()" bzw. "t2.getText()"

hat hier jemand eine Idee? :bahnhof:


----------



## Marco13 (20. Mai 2008)

Du solltest auf jeden Fall in Erwägung ziehen, diese Daten in einer eigenen Klasse zu speichern

```
class Data
{
    private String s;
    private double d0;
    private double d1;
   
    // Konstruktor, get-Methoden, ggf. set-Methoden
    ....

    public String toString()
    {
        return s+"      "+d0+"     "+d1;
    }
}
```

Und die dann in die Liste einfügen

```
(DefaultListModel) liste.getModel()).addElement(new Data(combo.getSelectedItem(), t.getText(), t2.getText()));
```

Dann kannst du dir später direkt die Einträge und die darin enthaltenen Daten holen.

```
Data e = (Data)list.getSelectedItem();
double d = e.getSecondDouble();
```

Die Alternative wäre, den Entry in einen String umzuwandeln, und da die gewünschten Daten rauszuparsen :? das geht, wäre aber IMHO ziemlich ... murksig.... :? 

```
String a = String.valueOf(list.getSelectedItem());
StringTokenizer st = new StringTokenizer(a);
String s = st.nextToken();
double d0 = Double.parseDouble(st.nextToken());
double d1 = Double.parseDouble(st.nextToken());
```


----------



## babaganoush (20. Mai 2008)

vielen dank schonmal für die antwort, habe mich auch direkt drangemacht, nur haperts bei der kommunikation zwischen  beiden klassen :-(

habe wie du gesagt hast eine neue klasse "daten" erstellt und kann auch wunderbar auf methoden und variablen der hauptklasse "xy" zugreifen:


```
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

class daten extends xy {

	public String s01;
	public double d01;
	public double d02;

	daten(String titel) {
		super(titel);

		combo.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				String s01 = (String) combo.getSelectedItem();
			}
		});
	}
}
```

nur kriege ich ne fehlermeldung wenn ich in der Hauptklasse testweise folgendes versuche:


```
add(t5);// testfeld
		c.gridx = 5;
		c.gridy = 10;
		c.gridwidth = 1;
		c.gridheight = 1;
		gbl.setConstraints(t5, c);
		t5.setText(s01);
```

"s01" wird als Fehler rausgeworfen weil die klasse es nicht kennt :-(
weißt du da auch direkt nen Anfängertipp? :-D


----------



## Marco13 (20. Mai 2008)

Man braucht auch ein Objekt, wo die Daten drinliegen.

Daten daten = new Daten("Titel");
 t5.setText(daten.s01);

Allerdings glaube ich, dass du da etwas falsch verstanden hast. Die comboBox sollte NICHT in den Daten verfügbar sein  :shock:


----------



## babaganoush (20. Mai 2008)

Ja, das glaube ich dann auch :-D


----------



## babaganoush (20. Mai 2008)

meine hauptklasse sieht als minimalbeispiel so aus:



```
import javax.swing.*;
import java.awt.*;
import java.awt.dnd.DropTarget;
import java.awt.event.*;
import java.awt.BorderLayout;
import javax.swing.JList;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;

public class xy extends JFrame {

	private static final String i = null;
	private JButton b2;
	private DefaultListModel model;
	private JList liste = null;

	private Double dl2;

	JButton b1;
	JComboBox combo = new JComboBox();
	JTextField t = new JTextField("0,00", 5);
	JTextField t2 = new JTextField("0,00", 5);

	class b1Lauscher implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			int i;
			((DefaultListModel) liste.getModel()).addElement(combo.getSelectedItem()+ " " + t.getText() + " " + 
                        t2.getText());
		}
	}

	xy(String titel) {
		super(titel);
		final DefaultListModel model = new DefaultListModel();
		liste = new JList(model);

		add(combo);
		combo.setEditable(true);
		combo.addItem("a");
		combo.addItem("b");
		add(b1);
		add(t);
		add(t2);
		add(liste);
		b1.addActionListener(new b1Lauscher());
	}

	public static void main(String[] args) {
		xy fenster = new xy("gui");
		fenster.pack();
		fenster.setSize(650, 595);
		fenster.setVisible(true);
	}
}
```

die daten-klasse habe ich ja gerade schon gezeigt :-( (nicht viel drinn). hat also jemand vielleicht erbarmen mich zu erleuchten, ich versteh es immer noch nicht :-(


----------



## babaganoush (21. Mai 2008)

hat keiner mitleid? :-(


----------



## SlaterB (21. Mai 2008)

ich kann keine konkrete Frage erstellen,

auf jeden Fall sollte die Datenklasse nicht von xy, also von JFrame erben,
jeder Eintrag wäre dann ein eigenen JFrame!
das kann zu nichts gut sein, auch nicht zum Zugriff auf Variablen von xy,
denn jedes Objekt der Datenklasse ist ja ein eigenes xy-Objekt,
während du dich wahrscheinlich nur für das bestimmte einzelne xy-Objekt interessiert, welches auf der GUI angezeigt wird


----------



## babaganoush (21. Mai 2008)

ich dachte dass ist das normale vorgehen wenn man auf variablen der klasse zugreifen möchte?

die frage ist: wie kann ich in der xy(main) klasse auf variablen der daten-klasse zugreifen


----------



## SlaterB (21. Mai 2008)

wenn 
Daten d = ..;
ein Daten-Objekt ist,
dann mit
d.getIrgendwas();

so wie jedes Objekt auf irgendein anderes zugreift?!

von liste kannst du das Model abfragen:
> liste.getModel()

was ist bei den Daten anders?


----------



## Marco13 (21. Mai 2008)

Mitleid .. ja ... das ist aber nichts positives. So wirst du nicht weit kommen

```
import javax.swing.*;
import java.awt.*;
import java.awt.dnd.DropTarget;
import java.awt.event.*;
import java.awt.BorderLayout;
import javax.swing.JList;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;


class Data
{
    private String s;
    private double d0;
    private double d1;

    public Data(Object object, String s0, String s1)
    {
        s = String.valueOf(object);
        d0 = Double.parseDouble(s0);
        d1 = Double.parseDouble(s1);
    }

    public String getString()
    {
        return s;
    }

    public double getD0()
    {
        return d0;
    }

    public double getD1()
    {
        return d1;
    }

    public String toString()
    {
        return s+" "+d0+" "+d1;
    }
}
public class xy extends JFrame
{

   private static final String i = null;
   private JButton b2;
   private DefaultListModel model;
   private JList liste = null;

   private Double dl2;

   JButton b1;
   JComboBox combo = new JComboBox();
   JTextField t = new JTextField("0.00", 5);
   JTextField t2 = new JTextField("0.00", 5);

   class b1Lauscher implements ActionListener {
      public void actionPerformed(ActionEvent e)
      {
         int i;
         Data data = new Data(combo.getSelectedItem(), t.getText(), t2.getText());
         ((DefaultListModel) liste.getModel()).addElement(data);
      }
   }

   xy(String titel) {
      super(titel);
      setLayout(new FlowLayout());
      final DefaultListModel model = new DefaultListModel();
      liste = new JList(model);
      b1 = new JButton("Leg's in die Liste");

      getContentPane().add(combo);
      combo.setEditable(true);
      combo.addItem("a");
      combo.addItem("b");
      getContentPane().add(b1);
      getContentPane().add(t);
      getContentPane().add(t2);
      getContentPane().add(liste);
      b1.addActionListener(new b1Lauscher());

      final JLabel label = new JLabel("Selected: ");

      JButton b2 = new JButton("Zeig' an, welches von der Liste ausgewählt ist");
      b2.addActionListener(new ActionListener()
      {
          public void actionPerformed(ActionEvent e)
          {
              Data data = (Data)liste.getSelectedValue();
              label.setText("Selected: "+String.valueOf(data));
          }
      });
      getContentPane().add(b2);
      getContentPane().add(label);



   }

   public static void main(String[] args) {
      xy fenster = new xy("gui");
      fenster.pack();
      fenster.setSize(650, 595);
      fenster.setVisible(true);
   }
}
```


----------



## babaganoush (22. Mai 2008)

hey wow, echt nett von dir  :toll: 

hab mich auch direkt drangemacht weiter zu programmieren, es ist ja nicht so als würde ich mich damit nicht beschäftigen. Die meißten Sachen kriege ich ja alleine raus :-D

zum Beispiel auch wie ich ein bisschen freien Platz  in die Liste zwischen den elemente kriege


```
+"       "
```

funktioniert nur leider nicht zwischen den letzten beiden elementen :-(

aber vielen dank in jedem fall  :bae:


----------

