Übergeben von ListModel an nichtparametrisierte JList

Pflaumi123

Mitglied
Hallo zusammen,

mein Ziel ist es ein Objekt der Klasse Liste mit der Größe z.B. 3 anzulegen(Das ist ja nun noch kein Hexenwerk :D)

Mit der GUI möchte ich beliebig ganze Zahlen in die JList hinzufügen. (Später auch wieder entfernen...)
--Das soll aber ohne die Benutzung von Parametern stattfinden--

Das Problem ist bei mir das Hinzufügen zur JList.
Die Klasse Liste war bis auf die extends-Anweisung bereits so gegeben und sollte nicht verändert werden(war der Ansatz, die Klasse Liste als Unterklasse von DefaultListModel zu verwenden richtig?)
Nun möchte ich der Klasse JList das Model setzen, in der Art:
list.setModel(getListe());
bei der Ausführung des Programms werden die Zahlen nun nicht in die Liste übertragen :/

Hier die Klasse Liste:
Java:
import javax.swing.DefaultListModel;

public class Liste extends DefaultListModel {
    private Object[] data;
    private int count;

    public Liste(int size) {
        data = new Object[size];
    }

    public void add(Object x) {
        if (count == data.length) {
            Object[] neu = new Object[data.length * 2];
            for (int i = 0; i < data.length; i++)
                neu[i] = data[i];
            data = neu;
        }
        data[count] = x;
        count++;
    }

    public Object remove() {
        if (count > 0) {
            count--;
            return data[count];
        } else
            return null;
    }

    public int getCount() {
        return count;
    }

}

Und nun hier die GUI:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JList;

public class GUI extends JFrame {

    private JPanel contentPane;

    private Liste liste;
    private JTextField txtZahl;
    private JLabel lblGanzeZahl;
    private JList list;
    private JButton btnSpeichern;
    /**
     * 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, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
  
        contentPane.add(getTxtZahl());
        contentPane.add(getLblGanzeZahl());
        contentPane.add(getBtnSpeichern());
        contentPane.add(getList());
      
    }

    private JTextField getTxtZahl() {
        if (txtZahl == null) {
            txtZahl = new JTextField();
            txtZahl.setBounds(134, 85, 146, 26);
            txtZahl.setColumns(10);
        }
        return txtZahl;
    }
    private JLabel getLblGanzeZahl() {
        if (lblGanzeZahl == null) {
            lblGanzeZahl = new JLabel("ganze zahl");
            lblGanzeZahl.setBounds(15, 88, 115, 20);
        }
        return lblGanzeZahl;
    }
    private Liste getListe(){
        if(liste == null){
            liste = new Liste(3);
          
        }
        return liste;
    }
  
    private JList getList(){
        if(list == null){
            list = new JList(liste);
//             oder: list.setModel(getListe());
            list.setBounds(191, 137, 89, 70);
          
        }return list;
    }
    private JButton getBtnSpeichern() {
        if (btnSpeichern == null) {
            btnSpeichern = new JButton("speichern");
            btnSpeichern.setBounds(25, 134, 115, 29);
            btnSpeichern.addActionListener(e-> {
                liste.add(Integer.parseInt(txtZahl.getText()));
              
              
            });
        }
        return btnSpeichern;
    }
}
Wäre toll, wenn mir jemand helfen kann :)
 
Zuletzt bearbeitet von einem Moderator:

Jardcore

Top Contributor
Wenn es die Möglichkeit gibt aus deiner Liste die Zahlen vorher auszulesen kannst du folgendes machen:
Java:
DefaultListModel<Integer> listModel = new DefaultListModel<Integer>();
for(int zahl : getListe()) {
        listModel.addElement(zahl);
}
      
list.setModel(listModel);
Also im Klartext, du musst deine Liste durchiterieren und die einzelnen Elemente zu einem Model hinzufügen und das dann der JList übergeben.
 

Pflaumi123

Mitglied
Ja, das ist ein Ansatz.
Nun lässt es sich auf dem Weg aber auch nicht umgehen die JList dann ebenso parametrisierbar zu machen, oder?
So sollte es eben nach Aufgabenstellung sein:
Erstellen Sie eine GUI, die ein Objekt der Klasse Liste mit einer Anfangsgröße von 3 anlegt. Diese soll beliebig ganzen Zahlen in die Liste speichern können (Operation add). Per Befehl sollen die Zahlen aus der Liste zurückgeholt (Operation remove) und deren Summe ausgegeben werden.

Und erst in der nächsten Aufgabe soll die Klasse generisch verwendet werden können.
 

Jardcore

Top Contributor
Nun lässt es sich auf dem Weg aber auch nicht umgehen die JList dann ebenso parametrisierbar zu machen, oder?
JList ist eh schon parametrisiert. Ich glaube es ist nicht gewünscht deine eigene Liste zu parametrisieren.

Und nö, das geht auch so. Mein Beispiel ist schon darauf gemünzt gewesen. Hier nochmal genauer...
Java:
DefaultListModel<Object> listModel = new DefaultListModel<Object>();
Object obj = null;
while((obj = liste.remove()) != null) {
   listModel.addElement(obj);
}

list.setModel(listModel);
 

Pflaumi123

Mitglied
@Jardcore
Ja, du hast recht. Habe nicht daran gedacht, dass JList standardmäßig mit Object parametrisiert ist, und die Aufgabe anfangs nicht ganz verstanden..
Habe es jetzt so in der Art hinbekommen, danke!
Könntest du mir trotzdem noch in Worten erklären, was das bedeutet:
while((obj = liste.remove()) != null)
Hab diese Art der whileSchleife noch nie gesehen.


Für evtl später noch Interessierte hier die Aufgabe:

a) Erstellen Sie eine GUI, die ein Objekt der Klasse Liste mit einer Anfangsgröße von 3 anlegt. Diese soll beliebig ganzen Zahlen in die Liste speichern können (Operation add). Per Befehl sollen die Zahlen aus der Liste zurückgeholt (Operation remove) und deren Summe ausgegeben werden.
b) Wandeln Sie die Klasse so um, dass Sie auch typsicher (generisch) verwendet werden kann. Erstellen Sie eine weitere GUI welches das gleich wie in a) macht, nun aber mit einer generischen Liste.

Der Code Klasse Liste ist oben im Beitrag.
 
Zuletzt bearbeitet:

Jardcore

Top Contributor
Hab diese Art der whileSchleife noch nie gesehen.

Eine while() Schleife kennst du? Falls nicht, das ist eine Schleife die solange läuft bis ihre Bedingung erfüllt ist.
In unserem Fall habe ich die Bedingung mit einer Zuweisung verknüpft.
Ich weise der Variable "obj" den Wert der remove() Methode deiner Liste zu. Die remove() Methode gibt ein Objekt der Klasse Object zurück...klingt verrückt^^

Nach der Zuweisung prüfe ich sofort ob "obj" != null ist, dadurch wird die Schleife verlassen, sobald die remove() Methode null zurückgibt. Das ist der Fall, wenn die Liste leer ist.

"obj" hab ich dann innerhalb der Schleife benutzt um dieses dem ListModel hinzuzufügen.

b) Wandeln Sie die Klasse so um, dass Sie auch typsicher (generisch) verwendet werden kann. Erstellen Sie eine weitere GUI welches das gleich wie in a) macht, nun aber mit einer generischen Liste.
Wie sehen denn deine Versuche bisher zu b) aus?
 

Joose

Top Contributor
Hab diese Art der whileSchleife noch nie gesehen.
Jardcore hat es schon erklärt, vollständigkeits halber aber:

Java:
while((obj = liste.remove()) != null) { 
    ....
}
Kann man auch umschreiben zu:
Java:
obj = liste.remove();
while(obj != null) {
    ....
    obj = liste.remove();
}
Dadurch ist zwar die Bedingung einfacher zu verstehen, der Code wird aber minimal länger. Außerdem ist die Zeile vor der Schleife wichtig für die Schleife ist aber dann eben nicht Teil der Schleife (beim verschieben und löschen aufpassen!)
 

Pflaumi123

Mitglied
okay, habe diese Schreibweise mit whileSchleife jetzt verstanden danke fürs erklären :)

bin nun doch noch nicht wirklich weiter. :D
es hadert daran dass ja nach der summe gefragt ist.
Die Ziffern, die übers Textfeld eingelesen werden und dann in der Liste stehen soll man ja laut Aufgabenstellung mit der remove()-Methode von Liste herbekommen. Die Methode liefert aber ein Object zurück.
Wie bekomme ich nun aus dem Object einen Integer-Wert?
Casten, ParseInt ..Funktioniert nicht :/

Wenn man die Parameter von JList und DefaultListModel zu Integer ändern könnte würde es vll klappen
Aber wenn ich das probiere kann ich liste dem listmodel nicht mehr hinzufügen.

Hier mein Ansatz: (Besagte Stelle relativ weit unten im BtnRemoveUndSumme - Block)
Code:
public class GUI extends JFrame {

    private JPanel contentPane;

   
    private JTextField txtZahl;
    private JLabel lblGanzeZahl;
    private JList<Object> list;
    private JButton btnSpeichern;
    private DefaultListModel<Object> listmodel;
    private Object object = null;
    private int groesse = 3;
    private Liste liste ;
    private JButton btnRemoveUndSumme;
    private JLabel lblSumme;
    private JLabel lblSummeInt;
    private int a = 0;
   
    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, 1028, 578);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
   
        contentPane.add(getTxtZahl());
        contentPane.add(getLblGanzeZahl());
        contentPane.add(getBtnSpeichern());
        contentPane.add(getList());
        contentPane.add(getBtnRemoveUndSumme());
        contentPane.add(getLblSumme());
        contentPane.add(getLblSummeInt());
       
    }

    private JTextField getTxtZahl() {
        if (txtZahl == null) {
            txtZahl = new JTextField();
            txtZahl.setBounds(134, 30, 146, 26);
            txtZahl.setColumns(10);
        }
        return txtZahl;
    }
    private JLabel getLblGanzeZahl() {
        if (lblGanzeZahl == null) {
            lblGanzeZahl = new JLabel("ganze zahl");
            lblGanzeZahl.setBounds(15, 33, 115, 20);
        }
        return lblGanzeZahl;
    }
    private Liste getListe(){
        if(liste == null){
            liste = new Liste(groesse);
        }
        return liste;
    }
   
    private DefaultListModel<Object> getMListe(){
        if(listmodel == null){
            listmodel = new DefaultListModel<>();
            listmodel.addElement(liste);
        }return listmodel;
    }
   
    private JList<Object> getList(){
        if(list == null){
            list = new JList<>();
            list.setModel(getMListe());
            list.setBounds(324, 16, 369, 450);
           
        }return list;
    }
    private JButton getBtnSpeichern() {
        if (btnSpeichern == null) {
            btnSpeichern = new JButton("speichern");
            btnSpeichern.setBounds(25, 85, 115, 29);
            btnSpeichern.addActionListener(e-> {
                liste = new Liste(groesse);      //Warum muss mann liste hier initialisieren und nicht oben bei den Variablendeklarationen?
                int o = Integer.parseInt(txtZahl.getText());
                liste.add(o);

                while((object = liste.remove()) != null){
                    listmodel.addElement(object);
                }
               
            });
        }
        return btnSpeichern;
    }
    private JButton getBtnRemoveUndSumme() {
        if (btnRemoveUndSumme == null) {
            btnRemoveUndSumme = new JButton("remove & Summe");
            btnRemoveUndSumme.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    int summe = 0;
                    for(int i = 0; i < liste.getCount(); i++){
                            Object helfer = liste.remove();
                        summe = summe + Integer.parseInt(liste.remove());
                       
                    }
                   
                    lblSummeInt.setText(""+summe);
                    listmodel.clear();
                }
            });
            btnRemoveUndSumme.setBounds(15, 133, 204, 29);
        }
        return btnRemoveUndSumme;
    }
    private JLabel getLblSumme() {
        if (lblSumme == null) {
            lblSumme = new JLabel("Summe:");
            lblSumme.setBounds(25, 192, 69, 20);
        }
        return lblSumme;
    }
    private JLabel getLblSummeInt() {
        if (lblSummeInt == null) {
            lblSummeInt = new JLabel("");
            lblSummeInt.setBounds(134, 192, 69, 20);
        }
        return lblSummeInt;
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben