JList, aus selectedValue bestimmten Wert aus Containerklasse auslesen

Heyho an alle und erstmals Grüße von mir.

Folgendes Problem: Ich habe eine Containerklasse “data_pflanze” erstellt und mittels dieser wird eine JList in der Klasse “Herb_gui” befüllt. Nun will ich aus dem Jlist selectedValue die Datenbank ID auslesen, um damit Änderungen in der MySql tablle machen zu können. Die Containerklasse bekommt die Daten aus einer MySql Tabelle. Ich bekomme die id aber nicht aus dem Model bzw aus dem selected value …

Containerklasse:


package herbarium;

public class data_pflanze
{
    private int pflanze_id;
    private String pflanze_name;

    public data_pflanze()
    {

    }

    public data_pflanze(int pflanze_id, String pflanze_name)
    {
        this.pflanze_id = pflanze_id;
        this.pflanze_name = pflanze_name;
    }

    public int getPflanze_id()
    {
        return pflanze_id;
    }

    public void setPflanze_id(int pflanze_id)
    {
        this.pflanze_id = pflanze_id;
    }

    public String getPflanze_name()
    {
        return pflanze_name;
    }

    public void setPflanze_name(String pflanze_name)
    {
        this.pflanze_name = pflanze_name;
    }

    @Override
    public String toString()
    {
        return getPflanze_name();
    }

}

In der JList soll nur der Name angezeigt werden. Für MySql Selects usw. brauche ich aber die ID aus der Datenbank.

GUI:

package herbarium;

import javax.swing.DefaultListModel;

public class Herb_gui extends javax.swing.JFrame
{
    MySql_herb data = new MySql_herb();
    DefaultListModel model = new DefaultListModel();
    int id;

    public Herb_gui()
    {
        initComponents();
    }

    private void jb_refreshActionPerformed(java.awt.event.ActionEvent evt)
    {

        model.clear();
        get_data();
    }

    private void btn_addActionPerformed(java.awt.event.ActionEvent evt)
    {
        data.Insert_plant(tf_insert_plant.getText());
    }

    private void btn_changeActionPerformed(java.awt.event.ActionEvent evt)
    {
        for (int i = 0; i < data.dp.size(); i++)
        {
            if (jList1.getSelectedValue()
                .equals(data.dp.get(i).getPflanze_id()))
            {
                id = data.dp.get(i).getPflanze_id();
            }
        }

        // Methode zum Ändern von Datensätzen
        Change_plant(plant, id);
    }

    private void btn_deleteActionPerformed(java.awt.event.ActionEvent evt)
    {
        get_data();
    }

    private void get_data()
    {
        model.clear();
        data.all_data();
        for (int i = 0; i < data.dp.size(); i++)
        {
            model.addElement(data.dp.get(i));
        }
        jList1.setModel(model);
    }
}

Angezeigt werden soll nur der Name, da ich aber für MySql Selects usw. die ID brauche, soll er mir den Listselect als Variable Id speichern, damit ich damit weiterarbeiten kann.


  for(int i = 0; i <data.dp.size();i++)
  {
  if(jList1.getSelectedValue().equals(data.dp.get(i).getPflanze_id()))
  {
  id = data.dp.get(i).getPflanze_id();
  }
  }

So kommt nur “Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: herbarium.data_pflanze cannot be cast to java.lang.String” raus. Im Model sind die Daten aber drin.

“data.dp” ist die Liste der Containerklasse. Irgendwie muß ich den JList select mit der ID in der for Schleife vergleichen.


id = ((data_pflanze)jList1.getSelectedValue()).getId();

Bei diesem Vorschlag kommt immer “incompatible types: String cannot be converted to data_pflanze” raus.
Hat jemand eine Idee wie ich das lösen kann?
Mfg Pete

Vorneweg: Naming conventions beachten!
Klassennamen im CamelCase schreiben
Variablen- und Methodennamen im camelCase schreiben
Und beides ohne_unterstriche

Ansonsten ist der Code etwas unübersichtlich und einiges fehlt. Im speziellen ist nicht ganz klar, was denn in “data” genau drin liegt. Ich gehe davon aus, dass es Objekte vom Typ “data_planze” sind (was eigentlich “PlantData” oder so heißen sollte).

Wenn dem so wäre, sollte
id = ((data_pflanze)jList1.getSelectedValue()).getId();
aber eigentlich funktionieren.

Aaaber…: Das könnte “kaputt” gehen, wenn irgendwann mal
data.Insert_plant(tf_insert_plant.getText());
ausgeführt werden würde - je nachdem, was bei “Insert_Plant” gemacht wird…

Hier ist mal ein Mini-GUI um die “data_pflanze”-Klasse drumgestrickt, wo das ausgewählte Element ausgegeben wird (und auch, ob das Element vielleicht gar keine Pflanze ist!)

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ExampleGui
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
    
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        DefaultListModel model = new DefaultListModel();
        model.addElement(new data_pflanze(1, "PlantA"));
        model.addElement(new data_pflanze(2, "PlantB"));
        model.addElement(new data_pflanze(3, "PlantC"));
        
        final JList list = new JList(model);
        list.addListSelectionListener(new ListSelectionListener()
        {
            @Override
            public void valueChanged(ListSelectionEvent e)
            {
                Object selectedValue = list.getSelectedValue();
                if (selectedValue instanceof data_pflanze)
                {
                    data_pflanze selectedPlant = (data_pflanze)selectedValue;
                    System.out.println(
                        "Selected " + selectedPlant.getPflanze_name() + 
                        " with ID " + selectedPlant.getPflanze_id());
                }
                else
                {
                    System.out.println(
                        "Wrong type in list: " + selectedValue + 
                        " is " + selectedValue.getClass());
                }
            }
        });
        
        f.getContentPane().add(new JScrollPane(list));
        
        f.setSize(400, 400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
    
}