Einer JList mit eigenem ListModel einen Eintrag hinzfügen

Pflaumi123

Mitglied
Hallo 🙂

Ich würde gerne der JList einen Eintrag des Typs Ziffer hinzufügen. Und das mithilfe einer Unterklasse von AbstractListModel(Parametrisiert), also sprich einem eigenen ListModel.

Beim Kompilieren kommt beim setzen des Models der Hinweis: "Type safety: The method setModel(ListModel) belongs to the raw type JList. References to generic type JList<E> should be parameterized"

Das Programm wirft keinen Laufzeitfehler, aber fügt die Ziffer der Jlist nicht hinzu...
Könnte mir jemand erklären woran das liegt?
Hier meine Klassen:
GUI:
Code:
public class GUI extends JFrame {

    private JPanel contentPane;
    private JTextField txtZiffer;
    private JList list;
    private JButton btnSpeichern;
    private UnterklasseAbstract<Ziffer> model;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI frame = new GUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public GUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 599, 491);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        contentPane.add(getTxtZiffer());
        contentPane.add(getList());
        contentPane.add(getBtnSpeichern());
    }

    private JTextField getTxtZiffer() {
        if (txtZiffer == null) {
            txtZiffer = new JTextField();
            txtZiffer.setBounds(68, 86, 146, 26);
            txtZiffer.setColumns(10);
        }
        return txtZiffer;
    }
    private JList<Ziffer> getList() {
        if (list == null) {
            list = new JList<Ziffer>();
            list.setBounds(272, 178, 200, 202);
            list.setModel(getUnterklasseAbstract());
        }
        return list;
    }
    private JButton getBtnSpeichern() {
        if (btnSpeichern == null) {
            btnSpeichern = new JButton("speichern");
            btnSpeichern.setBounds(80, 178, 115, 29);
            btnSpeichern.addActionListener( e -> {
                model.add(new Ziffer(2));
            });
        }
        return btnSpeichern;
    }
    private UnterklasseAbstract<Ziffer> getUnterklasseAbstract(){
        if(model == null){
            model = new UnterklasseAbstract<>();
        }
        return model;
    }
}

Unterklasse AbstractListModel:
Code:
public class UnterklasseAbstract<T> extends AbstractListModel<T>{
  
    private ArrayList<T> list;
    int i = 0;
  
    public UnterklasseAbstract(){
        list = new ArrayList<T>();
    }
  
    public void add(T t){
        list.add(t);
        }
  
    public void change(int index, T t){
        list.add(index, t);
    }
  
    public void remove(int index){
        list.remove(index);
    }
    @Override
    public T getElementAt(int index) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int getSize() {
        // TODO Auto-generated method stub
        return 0;
    }
//    public void change(int index){
//      
//    }
}

Klasse Ziffer:
Code:
public class Ziffer {
    private int nummer;
  
    public Ziffer(int nummer){
        this.nummer = nummer;
    }
    public void setNr(int nummer){
      
    }
  
    public int getNr(){
        return nummer;
    }
}

Vielen Dank und mfG 🙂
 
Da die Klasse JList generic ist sollte sie auch entsprechend deklariert werden:
private JList<Ziffer> list;
Das behebt nur die Compiler Warnung aber nicht die eigentlichen Probleme:

1. Die Methode getElementAt in deinem Model gibt immer null zurück
2. Die Methode getSize in deinem Model gibt immer 0 zurück
3. Du musst nach dem hizufügen die Methode fireIntervalAdded aufrufen

Versuchs mal so:
Java:
  public void add(T t) {
     list.add(t);
     fireIntervalAdded(this, list.size() - 1, list.size() - 1);
   }

  @Override
   public T getElementAt(int index) {
     return list.get(index);
   }

   @Override
   public int getSize() {
     return list.size();
   }
 
Um die Methoden getSize und getElementAt hatte ich mir zu dem Zeitpunkt noch keine Gedanken gemacht und nur übernommen deshalb waren die quasi noch leer..
Okay, die fireIntervallAdded() habe ich nun hinzugefügt. Die Parameter darin geben doch an an welcher Stelle der Eintrag hinzugefügt werden soll, oder?
Jetzt wird zwar etwas der Liste hinzugefügt, aber nur
'Packagename.Klassenname@787b607b'. Weißt du bei welcher Art Fehler man allgemein so eine Meldung bekommt? Hatte das nun schon öfter...
also irgendwo stimmt was noch nicht.. 😀

LG Pflaumi
 
Das ist kein Fehler, das ist einfach nur die Standardrückgabe von toString. Wenn du eine eigene Klasse definierst, kann Java ja schlecht wissen in welcher Form du das gerne Ausgegeben haben willst, daher gibt die toString Methode standardmäßig immer den Klassennamen+Objektadresse zurück. Wenn du lieber etwas anderes haben willst, musst du die toString Methode überschreiben und was anderes zurückgeben.
 
Moin,
'Packagename.Klassenname@787b607b'. Weißt du bei welcher Art Fehler man allgemein so eine Meldung bekommt?
Keine Ahnung, wo das bei Dir kommt, aber @787b607b ist KEINE Fehlermeldung, sondern die Adresse der Objectreferenz !!

Beispiel:
Java:
Array<String> myArray = new Array<String>;
// ... Array füllen
System.out.println( myArray[i] );  // würde den i-ten String ausgeben
System.out.println( myArray );  // gibt die o. g. Adresse aus

Gruß Klaus
 

Neue Themen


Zurück
Oben