JList, aus selectedValue bestimmten Wert aus Containerklasse auslesen

Pete2016

Mitglied
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:
Java:
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();
  }

}

GUI Klasse:
Java:
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);
  }
}

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

Java:
  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.
debug2.png

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


Code:
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
 
Zuletzt bearbeitet von einem Moderator:
Vermutung: Deine JList hat kein generisches Attribut bzw sie hat das Attribut String.
Eine Lösung hierfür wäre, sowohl die Jlist, wie auch das TableModel bekommen "data_pflanze" als generisches Attribut.
Ansonsten sind die "anderen" Zeilen bei der Fehlermeldung natürlich interessant.
 
Also sie hat m.E. nach das Attribut Object über das List Model und das müsste ja damit theorethisch ausgelesen werden können. Wie kann ich überprüfen, ob die JList bzw. das Model generisch ist? So wie das jetz verstanden bzw. gelesen hab, sollte es generisch sein(Bin aber auch Laie in dem Jargon hier). Habe gerade gelesen, das man den selectexd value iwie auf den tatsächlichen Objekttyp zurück casten muß. Hier mal alle Zeilen:

debug4.PNG
und der nächste Versuch (allerdings hab ich hier keinen Bezug zu selected value).

debug3.PNG
 
Habe jetzt anstatt
"DefaultListModel model = new DefaultListModel()"
"DefaultListModel<data_pflanze> model = new DefaultListModel<>();"
benutzt. Dann hab ich den JList Typ auf <data_pflanze> umgestellt. Vorher war der auf <String>.

Jetzt kommt folgendes im auto generate obere Zeile:debug5.PNG

und unten:
debug6.PNG
Was müsste ich denn da im Code Customizer der Jlist genau ändern?
 
Habe es letztendlich durch die Hilfe von JCODA lösen können. Vielen Dank an dieser Stelle noch mal^^.
Also für alle nochmal die ev. mal vor dem gleichen Prob stehen. Habe anstatt
"DefaultListModel model = new DefaultListModel()"
"DefaultListModel<data_pflanze> model = new DefaultListModel<>();"
benutzt. Dann hab ich den JList Typ im Designer unter Type Parameter von <String> auf <data_pflanze> umgestellt. Im Code Customizer von jList1 wurde der Standard Code durch
jList1.setModel(model); ersetzt und aus get_data() Methode rausgenommen.
Jetzt kann ich den selectedValue der JList direkt als id vergleichen.
Code:
        int id = 0;
        for(int i = 0; i <data.dp.size();i++)
        {
             if(jList1.getSelectedValue().getPflanze_id() == (data.dp.get(i).getPflanze_id()))
             {
                id = data.dp.get(i).getPflanze_id();
             }
        }

Mfg Pete
 

Zurück
Oben