Eingabe in JTextField in Array speichern und in JList ausgeben

Bitte aktiviere JavaScript!
Hallo,

ich möchte in ein JTextField Eingaben machen, in ein Array speichern (soll später noch für eine DB nutzbar sein, muss alles untereinander geschrieben sein) und in einer JList anzeigen.

Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

import java.awt.BorderLayout;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Scanner;
import java.awt.event.ActionEvent;

public class JTextInJList {

    private JFrame frame;
    private JTextField textField;
    private String[] liste;
    

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

    /**
     * Create the application.
     */
    public JTextInJList() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 590, 411);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout(0, 0));
        
        DefaultListModel listModel = new DefaultListModel();
        JList list = new JList(listModel);

        
        
        frame.getContentPane().add(list, BorderLayout.CENTER);

        
        JButton reinda = new JButton("Hinzufügen");
        reinda.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                
                liste = new String[0];
            
                
                
                liste[0] = textField.getText();
                
                for(int i = 0; i < liste.length; i++) {
                    listModel.addElement(liste);
                }
                
                
                textField.setText("");
                

            }
        });
        frame.getContentPane().add(reinda, BorderLayout.WEST);
        
        JButton rausda = new JButton("Löschen");
        rausda.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        frame.getContentPane().add(rausda, BorderLayout.EAST);
        
        textField = new JTextField();
        frame.getContentPane().add(textField, BorderLayout.NORTH);
        textField.setColumns(10);
        

    }
}
Aber irgendwie klappt das ganze nicht
 
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Also erst einmal wäre wichtig zu wissen, was nicht klappt und auch was Du denn genau erreichen willst.

Der ActionListener von Deinem Button kann so nicht funktionieren. Ein Array mit Größe 0 hat keine Elemente. Auf das erste Element mit Nr. 0 kannst Du also nicht zugreifen, da es das nicht gibt. Sollte also ein Array der Größe 1 sein, um dann auf Element 0 zugreifen zu können.

Da es nur ein Element gibt, ist die Schleife natürlich Unsinn, denn die Liste wird immer nur ein Element haben und da kann man direkt drauf zugreifen.
Ein Array mit nur einem Element braucht man auch nicht, da kann man das Element ja direkt nehmen.
Somit ändert sich der Code wohl zu:
Java:
reinda.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String newEntry = textField.getText();
                listModel.addElement(newEntry);
                textField.setText("");
            }
        });
(Ungetestet und im Forum-Editor verfasst. Also möglicherweise typos und so drin.)

War das bereits das, was Du als "nicht funktionieren" bezeichnet hast? Oder war ich an einem Teil, zu dem Du noch nicht gekommen bist?
 
In meinem Code wird in der Schleife „length“ nicht akzeptiert.

Ich will in ein Textfeld Daten eingeben, die dann in ein Array mit einer Spalte Zeile für Zeile gespeichert werden. Dieses Array wird später noch in einer DB verwendet. Die JList dient nur zur veranschaulichung des Arrays.

Mit jedem Mal wenn ich auf den Button „reinda“ drücke, soll der Inhalt den ich eingebe im Array gespeichert und in der Jlist angezeigt werden.

„Text 1“
„Text 2“
....

Soll alles untereinander stehen


EDIT: Also mit deinem Code krieg ich alles in der JList untereinander. Aber der String wird dann jedesmal umgeschrieben. Ich brauche daher ein String Array wo die vorherigen Eingaben gespeichert bleiben
 
Zuletzt bearbeitet:
Also zum einen sind die Werte ja in der JList enthalten und können dort auch ausgelesen werden. Daher ist die Frage, ob du es noch einmal speichern musst....

Ansonsten ist ein Array schlecht, weil du da ja eine feste Größe angeben musst und die hast du ja nicht. Java bringt aber einiges an Datenstrukturen mit, die hier verwendet werden können. Aber dazu müsste man mehr wissen: ist die Reihenfolge wichtig? Dann hättest du also eine Liste -> List. Wenn die Reihenfolge egal ist, dann wäre es nur eine Menge -> Set.

Da findet sich bestimmt einige im Web zu.
Doku zu den genannten Interfaces wären:

Also Anwendung wäre fast identisch zur JList: du hast eine Instanz in deiner Klasse und die initialisierst du einmal und in jedem Händler fügst du da das Element hinzu.
 
Danke für den Tipp. Hab das jetzt mal so gemacht. Habe jetzt nur das Problem, dass er in die Liste
Text 1
Text 1 Text 2
Text 1 Text 2 Text 3
schreibt

und in der JList
Text 1 Text 2 Text 3
Text 1 Text 2 Text 3
Text 1 Text 2 Text 3
ausgibt.

Ich will es in beiden gern so:
Text 1
Text 2
...

Liegt es vielleicht an textField.setText("") , dass der Inhalt des Textfeldes garnicht gelöscht wird sondern quasi nur "unsichtbar" ?

Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Scanner;
import java.awt.event.ActionEvent;

public class JTextInJList {

    private JFrame frame;
    private JTextField textField;

    ArrayList<String> Liste = new ArrayList<>();

    


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

    /**
     * Create the application.
     */
    public JTextInJList() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 590, 411);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout(0, 0));
        
        DefaultListModel<ArrayList<String>> listModel = new DefaultListModel<ArrayList<String>>();
        JList<ArrayList<String>> list = new JList<ArrayList<String>>(listModel);

        
        
        frame.getContentPane().add(list, BorderLayout.CENTER);

        
        JButton reinda = new JButton("Hinzufügen");
        reinda.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                
                
                Liste.add(textField.getText());
                listModel.addElement(Liste);
                textField.setText("");
                
                
                System.out.println(Liste);
            }
        });
        frame.getContentPane().add(reinda, BorderLayout.WEST);
        
        JButton rausda = new JButton("Löschen");
        rausda.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        frame.getContentPane().add(rausda, BorderLayout.EAST);
        
        textField = new JTextField();
        frame.getContentPane().add(textField, BorderLayout.NORTH);
        textField.setColumns(10);
        

    }
}
 
Wieso fügst du denn die Liste dazu? Der Code bleibt gesund auf so, wie ich schon gepostet habe. Lediglich wird der String aus dem Textfeld nicht nur in der JList sondern auch noch in der neuen Liste hinzugefügt.
 
Wieso fügst du denn die Liste dazu? Der Code bleibt gesund auf so, wie ich schon gepostet habe. Lediglich wird der String aus dem Textfeld nicht nur in der JList sondern auch noch in der neuen Liste hinzugefügt.
Aus deinem Code lese ich nur wie die Daten in die JList kommen.
Ich muss den Inhalt aber wie gesagt weiterverwenden und in eine DB schreiben. Wie kann ich denn alle Zeilen der JList ansprechen?


Ich brauche quasi eine Art "getAllElements" Befehl..

Oder ich erstelle halt ein Array, String[], List (was auch immer..) und sage jedesmal wenn ich den Button klicke, dass der Text in eine neue Zeile geschrieben wird...
 
Zuletzt bearbeitet:
Hmm, ich denke, dass du einen Schritt nach dem Anderen gehen solltest. Du hast da aus meiner Sicht versucht, zwei Dinge auf einmal zu machen:
Zum einen hast du die Liste hinzugefügt und fügst die Elemente in die Liste ein. Das ist der erste Schritt, der hätte schon ausgereicht um die Elemente in der Liste und im JList zu haben.

Gleichzeitig hast du aber dann auch versucht, da mit dem DefaultListModel zu arbeiten. Prinzipiell OK, aber da hat sich dann ein Fehler eingeschlichen. Was willst du denn in der JList speichern? Doch nur einzelne Strings. Somit wäre meine Erwartungshaltung, dass du ein DefaultListModel<String> brauchst. Und dann fügst du da natürlich nicht immer die ganze Liste hinzu sondern natürlich nur den letzten String.

Und um an den Inhalt eine JList zu kommen,, kannst du dir immer das Model geben lassen. Das bietet Dir Zugriff auf alle Elemente. Aber da du ja jetzt das Model selbst erzeugst, hast du ja eine Instanz davon.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben