Array eintrag mit möglichst wenig code lösen

Ich arbeite gerade an einem programm welches die Namen welche in ein Textfeld eingegeben wurden in einem array speichern soll wenn die eingabe durch einenen Knopf bestätigt wurde . Ist es möglich das der wert von i um eines erhöht wird so das der nächste name automatisch auf der zweiten index position gespeichert wird ?

Java:
        String [] names = new String [5];
        int i = 0;
   
ActionListener al = new ActionListener () {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if (e.getSource()== Speichern) {
            names[i] = Name.getText();
               
        }
       
    }
};

Show.addActionListener(al);
Speichern.addActionListener(al);
 
Erstmal die obligatorische Bitte: halte Dich an die Benennungskonventionen von Java, d. h. Bezeichner für Variablen, Parameter und Methoden in lowerCamelCase und für Typen (Klassen & Co.) in UpperCamelCase. Dein Code ist ansonsten schwer zu lesen bzw. missverständlich (Name.getText() deutet z. B. auf eine Klasse mit einer statischen Methoden getText hin, obwohl es vermutlich einfach nur eine Variable vom Typ JTextField ist).

Dann: stehen die Namen denn in einem Textfeld oder in mehreren?

i erhöhen geht einfach mit i++ oder i+=1 oder i = i+1 - such Dir eins aus :)
 
Die Namen sollen einzelnd in ein Textfeld eingetragen werden
An welche stelle kann das i++ gesetzt wenn ich es unter die Zeile mit Name.getText wird mir der fehler : Local variable i defined in an enclosing scope must be final or effectively final angezeigt
 
K

kneitzel

Die Namen sollen einzelnd in ein Textfeld eingetragen werden
An welche stelle kann das i++ gesetzt wenn ich es unter die Zeile mit Name.getText wird mir der fehler : Local variable i defined in an enclosing scope must be final or effectively final angezeigt
Die Variable i ist eine lokale Variable und lokale Variablen, die man in einer inner class verwendet, dürfen nicht verändert werden.

Wieso nutzt Du keine Instanzvariablen? Es geht doch bei dem Array und der Variablen um Dinge, die Du generell haben willst und nicht nur lokal in einer Methode.

Und i solltest Du Dir einen sinnvollen Namen überlegen ....
 
K

kneitzel

In ein Textfeld werden also "Elsa Hans Franz Matthias Lisa" eingetragen? Dann: names = textfeld.getText().split("\\s");
Von seinem Code ausgehend ist es eher so, dass immer nur ein Name eingegeben wird, dann wird ein Button gedrückt und dann kann der nächste Name eingegeben werden ....
 
wenn ich
Code:
        String [] names = new String[5];
        int i = 0;
       
ActionListener al = new ActionListener () {
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if (e.getSource()== Speichern) {
            names[i++] = Name.getText();
        }
        if (e.getSource()==Show) {
            System.out.print(names);
        }  
       
    }
Nutze wird mir immer noch angezeigt : Local variable i defined in an enclosing scope must be final or effectively final
Stehe gerade glaube ich etwas auf dem schlauch
 
Java:
import java.awt.BorderLayout;
import javax.swing.*;

import java.util.StringJoiner;

public class Test {
    private String[] names = new String[5];
    private int currentName;

    private JLabel inputPrompt;
    private JLabel output;
    
    public void run() {
        inputPrompt = new JLabel("Name:");

        JPanel input = new JPanel();
        JTextField name = new JTextField(40);
        JButton okButton = new JButton("OK");

        input.add(inputPrompt);
        input.add(name);
        input.add(okButton);

        output = new JLabel();

        okButton.addActionListener(e -> saveName(name.getText()));
        updateUI();

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(input, BorderLayout.NORTH);
        frame.add(output);

        frame.pack();
        frame.setVisible(true);        
    }

    private void saveName(String name) {
        names[currentName] = name;
        currentName = (currentName + 1) % names.length;
        updateUI();
    }

    private void updateUI() {
        updateOutput();
        updatePrompt();
    }

    private void updatePrompt() {
        inputPrompt.setText(String.format("Name %d: ", currentName+1));
    }

    private void updateOutput() {
        StringJoiner j = new StringJoiner("<br>");
        for (int i = 0; i < names.length; i++) {
            j.add(names[i] == null ? "&nbsp;" : names[i]);
        }
        output.setText("<html>" + j.toString() + "</html>");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
K

kneitzel

@mrBrown Habe ich gemacht mir wird nach wie vor der gleiche fehler angezeigt
Dann zeig deinen Code, wie er jetzt ist. Die Fehlermeldung besagt, dass du immer noch eine lokale Variable nutzt.

Hast du evtl. eine Instanzvariable i hinzugefügt aber du hast immer noch die lokale Variable weil du das int bei der Zuweisung nicht entfernt hast?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben