Interpreter-Fehler Kompliziertes Array befüllen

Mino1337

Mitglied
Hallo,

Mein Projekt wird immer Komplizierter und nun habe ich einen Fehler den ich nicht Lösen kann.

Ich möchte euch zuviel Code ersparen und Poste hier mal nur die stellen die es betrifft:

Ich habe ein UI welches auf Knopfdruck verschiedene Dialoge öffnet in denen man in Textfeldern etwas reinschreiben kann.

Hier ist eine Klasse welche lediglich mitzählt wieviele JTextFields in diesem Dialog erzeugt wurden und das jeweilige JTextField an eine Methode weitergibt in der Klasse Dialog.

Java:
package Benutzeroberfläche;

import javax.swing.JTextField;
import javax.swing.text.Document;

public class Textfeld extends JTextField{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
   
    private JTextField textfeld;
    private static int textfelder;

    public Textfeld() {
        // TODO Automatisch generierter Konstruktorstub
    }

    public Textfeld(String text) {
        super(text);
        // TODO Automatisch generierter Konstruktorstub
    }

    public Textfeld(int columns) {
        super(columns);
        textfeld = new JTextField(columns);
        textfelder = textfelder+1;
        Dialog.textfeldArray(textfeld);
    }

    public JTextField getTextfeld() {
        return textfeld;
    }

    public static int getTextfelder() {
        return textfelder;
    }

    public Textfeld(String text, int columns) {
        super(text, columns);
        // TODO Automatisch generierter Konstruktorstub
    }

    public Textfeld(Document doc, String text, int columns) {
        super(doc, text, columns);
        // TODO Automatisch generierter Konstruktorstub
    }
   
    public static void textfelderZurücksetzen(){
        textfelder = 0;
    }
}

Da man vorher nicht weiss wieviele Textfelder der Benutzer braucht habe ich es so gemacht das der User beliebig viele erzeugen kann mit Knopfdruck. Die erzeugten werden gezählt und zur folgenden Methode weitergegeben:

Java:
  private static JTextField array[];
   private String stringArray[];

....
viel Code
....

public static void textfeldArray(JTextField y){
       
        if (array == null){
            array = new JTextField[1];
            array[0] = y;
        }
       
        JTextField[] hilfsarray = new JTextField[Textfeld.getTextfelder()];
       
        for(int i = 0; i < array.length; i++){
            hilfsarray[i] = array[i];
        }
       
        hilfsarray[Textfeld.getTextfelder()-1] = y;
       
        array = new JTextField[Textfeld.getTextfelder()];
       
        for(int i = 0; i < hilfsarray.length; i++){
            array[i] = hilfsarray[i];
        }
    }

Diese Methode erstellt ein Array welches mitwächst und die JTextFields enthält, damit ich später eine Adresse habe an die ich mich richten kann, wenn ich wissen will was nun reingeschrieben wurde.
Am Ende sollen die JTextFields die im Array sind, wenn ich auf den okay Button klicke, die eingegebenen Texte in ein das stringArray übertragen. Mit folgender Methode:

Java:
public void stringArray(){
        stringArray = new String[array.length];
        for(int i = 0; i < array.length; i++){
            stringArray[i] = array[i].getText();
            System.out.println(stringArray[i]);
        }
    }

Im ActionListener des betreffenden "Okay"-Buttons steht diese Methode drin.

Da es sich noch immer um den selben Dialog handelt müsste das doch klappen. Jedoch habe ich mit der Debugging-Funktion von Eclipse herrausgefunden das der "array" am ende zwar korrekt alle JTextFields endhält jedoch die stringArray = array.getText(); Methode nicht tut was sie tun soll.

Ich weiss nicht weiter. Eclipse zeigt keine Fehler an es müsste Theoretisch funktionieren.


Für den fall das ich relevante Teile vergessen habe zu Posten, poste ich hier nocheinmal alle meine Dialog Klasse.

Vielen Dank für eure Hilfe =) ....

Java:
package Benutzeroberfläche;

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import Funktionalität.Verzeichnis;

public class Dialog implements ActionListener, WindowListener{

    private JDialog dialog;
    private JPanel hauptPanel;
    private JPanel contentPanel;
    private JPanel buttonPanel;
    private JTextField neueSammlungTF;
    private JLabel labelSammlung;
    private JLabel labelErsteEigenschaft;
    private JButton okay;
    private JButton okayEintrag;
    private JButton abbrechen;
    private JButton neueEigenschaft;
    private GridBagLayout gbl_hauptpanel;
    private GridBagLayout gbl_contentPanel;
    private GridBagLayout gbl_buttonPanel;
    private Textfeld textfeld0;
    private static JTextField array[];
    private String stringArray[];
   
   
   
     Dialog(JFrame f,String s) {
       
        dialog = new JDialog(f);
        hauptPanel = new JPanel();
        contentPanel = new JPanel();
        buttonPanel = new JPanel();
        neueSammlungTF = new JTextField();
        labelSammlung = new JLabel("Sammlung");
        labelErsteEigenschaft = new JLabel("1. Eigenschaft");
        okay = new JButton("Okay");
        okayEintrag = new JButton("Okay");
        abbrechen = new JButton("Abbrechen");
        neueEigenschaft = new JButton("Neue Eigenschaft");
        gbl_hauptpanel = new GridBagLayout();
        gbl_contentPanel = new GridBagLayout();
        gbl_buttonPanel = new GridBagLayout();
        textfeld0 = new Textfeld(20);
        settings(f,s);
    }
   
    public void settings(JFrame f,String s) {
        if(s == "neueSammlung"){
        dialog.setTitle("Neue Sammlung");
        dialog.setModalityType(ModalityType.APPLICATION_MODAL);
        dialog.setSize(new Dimension(500, 170));
        dialog.setResizable(false);
        dialog.setLocationRelativeTo(f);
        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        dialog.addWindowListener(this);
       
        dialog.add(hauptPanel);
        hauptPanel.setLayout(gbl_hauptpanel);
       
        MasterFrame.setConstraints(contentPanel,gbl_hauptpanel,0,0,1,1,0,0,1.0,0.0,5,5,5,5,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
        hauptPanel.add(contentPanel);
        contentPanel.setLayout(gbl_contentPanel);
       
        MasterFrame.setConstraints(buttonPanel,gbl_hauptpanel,0,1,1,1,0,0,1.0,0.0,5,5,5,5,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
        hauptPanel.add(buttonPanel);
        buttonPanel.setLayout(gbl_buttonPanel);
       
        MasterFrame.setConstraints(abbrechen,gbl_buttonPanel,1,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.EAST);
        buttonPanel.add(abbrechen);
        abbrechen.setActionCommand("abbrechen");
        abbrechen.addActionListener(this);
       
        MasterFrame.setConstraints(okay,gbl_buttonPanel,0,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.EAST);
        buttonPanel.add(okay);
        okay.setActionCommand("okay");
        okay.addActionListener(this);
       
        MasterFrame.setConstraints(neueSammlungTF,gbl_contentPanel,0,0,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
        contentPanel.add(neueSammlungTF);
       
        MasterFrame.setConstraints(labelSammlung,gbl_contentPanel,1,0,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
        contentPanel.add(labelSammlung);
       
        MasterFrame.setConstraints(textfeld0,gbl_contentPanel,0,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
        contentPanel.add(textfeld0);
       
        MasterFrame.setConstraints(labelErsteEigenschaft,gbl_contentPanel,1,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
        contentPanel.add(labelErsteEigenschaft);
       
        MasterFrame.setConstraints(neueEigenschaft,gbl_contentPanel,2,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
        contentPanel.add(neueEigenschaft);
        neueEigenschaft.setActionCommand("neueEigenschaft");
        neueEigenschaft.addActionListener(this);
       
        dialog.setVisible(true);
        }else if(s == "neuerEintrag"){
            dialog.setTitle("Neuer Eintrag");
            dialog.setModalityType(ModalityType.APPLICATION_MODAL);
            dialog.setSize(new Dimension(500, 170));
            dialog.setResizable(false);
            dialog.setLocationRelativeTo(f);
            dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            dialog.addWindowListener(this);
           
            dialog.add(hauptPanel);
            hauptPanel.setLayout(gbl_hauptpanel);
           
            MasterFrame.setConstraints(contentPanel,gbl_hauptpanel,0,0,1,1,0,0,1.0,0.0,5,5,5,5,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            hauptPanel.add(contentPanel);
            contentPanel.setLayout(gbl_contentPanel);
           
            MasterFrame.setConstraints(buttonPanel,gbl_hauptpanel,0,1,1,1,0,0,1.0,0.0,5,5,5,5,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            hauptPanel.add(buttonPanel);
            buttonPanel.setLayout(gbl_buttonPanel);
           
            MasterFrame.setConstraints(abbrechen,gbl_buttonPanel,1,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.EAST);
            buttonPanel.add(abbrechen);
            abbrechen.setActionCommand("abbrechen");
            abbrechen.addActionListener(this);
           
            MasterFrame.setConstraints(okayEintrag,gbl_buttonPanel,0,1,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.EAST);
            buttonPanel.add(okayEintrag);
            okayEintrag.setActionCommand("okayEintrag");
            okayEintrag.addActionListener(this);
           
            TreePath tp = Verzeichnisstruktur.getTree().getSelectionPath();
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tp.getLastPathComponent();
            Object userObject = selectedNode.getUserObject();
            Verzeichnis a = (Verzeichnis)userObject;
            String[] array = a.getArray();
           
           
            for(int i = 0; i < array.length; i++){
           
            Textfeld neuestextfeld = new Textfeld(20);
            MasterFrame.setConstraints(neuestextfeld,gbl_contentPanel,0,i,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
            contentPanel.add(neuestextfeld);
           
            JLabel label = new JLabel(array[i]);
            MasterFrame.setConstraints(label,gbl_contentPanel,1,i,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
            contentPanel.add(label);
           
            if(Textfeld.getTextfelder() > 2){
                dialog.setSize(new Dimension(500, dialog.getSize().height+30));
            }
           
            }

           
            dialog.setVisible(true);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("neueEigenschaft")){
            JLabel text = new JLabel(Textfeld.getTextfelder()+1+". Eigenschaft");
            Textfeld neuestextfeld = new Textfeld(20);
            MasterFrame.setConstraints(neuestextfeld,gbl_contentPanel,0,1+Textfeld.getTextfelder(),1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);
            MasterFrame.setConstraints(text,gbl_contentPanel,1,1+Textfeld.getTextfelder(),1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);
            contentPanel.add(neuestextfeld);
            contentPanel.add(text);
            MasterFrame.setConstraints(neueEigenschaft,gbl_contentPanel,2,1+Textfeld.getTextfelder(),2,1,0,0,0.0,0.0,0,0,0,0,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);
            dialog.validate();
            dialog.repaint();
            if(Textfeld.getTextfelder() > 2){
                dialog.setSize(new Dimension(500, dialog.getSize().height+30));
                dialog.validate();
                dialog.repaint();
            }
        }else if(e.getActionCommand().equals("textfeldNeuerEintrag")){
            String text = neueSammlungTF.getText();
            Main.master.getBaum().eintrag(text);   
        }else if(e.getActionCommand().equals("okay")){
            String text = neueSammlungTF.getText();
            stringArray();
            Main.master.getBaum().verzeichnis(text,stringArray);
            array = null;
            stringArray = null;
            dialog.dispose();
        }else if(e.getActionCommand().equals("abbrechen")){
            array = null;
            stringArray = null;
            dialog.dispose();
        }else if(e.getActionCommand().equals("okayEintrag")){
            String text = neueSammlungTF.getText();
            Main.master.getBaum().eintrag(text);
            dialog.dispose();
        }
       
    }
   
    public static void textfeldArray(JTextField y){
       
        if (array == null){
            array = new JTextField[1];
            array[0] = y;
        }
       
        JTextField[] hilfsarray = new JTextField[Textfeld.getTextfelder()];
       
        for(int i = 0; i < array.length; i++){
            hilfsarray[i] = array[i];
        }
       
        hilfsarray[Textfeld.getTextfelder()-1] = y;
       
        array = new JTextField[Textfeld.getTextfelder()];
       
        for(int i = 0; i < hilfsarray.length; i++){
            array[i] = hilfsarray[i];
        }
    }
   
    public void stringArray(){
        stringArray = new String[array.length];
        for(int i = 0; i < array.length; i++){
            stringArray[i] = array[i].getText();
            System.out.println(stringArray[i]);
        }
    }

    @Override
    public void windowActivated(WindowEvent arg0) {
        // TODO Automatisch generierter Methodenstub
       
    }

    @Override
    public void windowClosed(WindowEvent arg0) {
        Textfeld.textfelderZurücksetzen();
       
    }

    @Override
    public void windowClosing(WindowEvent arg0) {
        Textfeld.textfelderZurücksetzen();
       
    }

    @Override
    public void windowDeactivated(WindowEvent arg0) {
        // TODO Automatisch generierter Methodenstub
       
    }

    @Override
    public void windowDeiconified(WindowEvent arg0) {
        // TODO Automatisch generierter Methodenstub
       
    }

    @Override
    public void windowIconified(WindowEvent arg0) {
        // TODO Automatisch generierter Methodenstub
       
    }

    @Override
    public void windowOpened(WindowEvent arg0) {
        // TODO Automatisch generierter Methodenstub
       
    }

}
 
Öhm Nein, die Methode soll ja die in die Textfelder welche in der Textfeld klasse übergeben werden als String in den stringArray übhertragen. Allerdings ist der stringArray immer Leer. Genau gesagt ist stringArray[0] = "" und der rest vom Array ist "null", egal wieviele Textfelder ich erzeuge und was ich reinschreibe.

Insgesamt öffnet sich ein Dialog mit zwei textfeldern die schon da sind, neben dem zweiten ist ein Button, wenn man ihn drückt wird ein neues Textfeld erzeugt und der Button steht neben dem neuen Textfeld. Jedesmal wenn man den Button gedrückt hat erweitert sich das "array"-Array und speichert die JTextFields in sich. Drückt man am Ende auf den "Okay"-Button sollte die "stringArray"-Methode die texte die in den JTextFields im "array"-Array stehen mithilfe der getText()-Methode als String speichern.

Das heisst das "string"-Array sollte am ende die Texte gespeichert haben welche man in die JTextFields eingetragen hat.
 
Hier ist eine Klasse welche lediglich mitzählt wieviele JTextFields in diesem Dialog erzeugt wurden und das jeweilige JTextField an eine Methode weitergibt in der Klasse Dialog.

Java:
package Benutzeroberfläche;
import javax.swing.JTextField;
import javax.swing.text.Document;

public class Textfeld extends JTextField{  
    private JTextField textfeld;
    private static int textfelder;

    public Textfeld() {
    }

    public Textfeld(String text) {
        super(text);
    }

    public Textfeld(int columns) {
        super(columns);
        textfeld = new JTextField(columns);
        textfelder = textfelder+1;
        Dialog.textfeldArray(textfeld);
    }

    public JTextField getTextfeld() {
        return textfeld;
    }

    public static int getTextfelder() {
        return textfelder;
    }

    public Textfeld(String text, int columns) {
        super(text, columns);
    }

    public Textfeld(Document doc, String text, int columns) {
        super(doc, text, columns);
    }
  
    public static void textfelderZurücksetzen(){
        textfelder = 0;
    }
}

Sorry aber diese Klasse ergibt so überhaupt keinen Sinn.
Du leitest hier ohne ersichtlichen Grund von JTextField ab, nur um die erstellten JTextFields Objekte zu zählen.

A: Entweder du lässt die Ableitung bestehen, dann darfst du aber im Konstruktor nicht ein neues JTextField Objekt erzeugen (sondern gib dich selber weiter). Dein Textfeld Objekt selbst ist schon ein JTextField. So erzeugst du immer 2 Objekte wovon eines einfach unnütz ist und den Speicher zumüllt.

B: Du lagerst die Erstellung für JTextFields für die Dialoge in eine Utility Klasse aus, und die Klasse zählt für dich mit. Dazu braucht es keine eigene Klasse und du erreichst das was du willst.

Java:
public static void textfeldArray(JTextField y){
        if (array == null){
            array = new JTextField[1];
            array[0] = y;
        }
      
        JTextField[] hilfsarray = new JTextField[Textfeld.getTextfelder()];
      
        for(int i = 0; i < array.length; i++){
            hilfsarray[i] = array[i];
        }
      
        hilfsarray[Textfeld.getTextfelder()-1] = y;
      
        array = new JTextField[Textfeld.getTextfelder()];
      
        for(int i = 0; i < hilfsarray.length; i++){
            array[i] = hilfsarray[i];
        }
    }

Bis du dir sicher das die Methode so arbeitet wie du es willst?
Du erstellst wenn noch nicht vorhanden ein Array mit der Länge 1.
Dann kopierst du herum und erzeugst neue Arrays die immer so groß sind wie dein zuerst erstellte => das Array hat immer die Länge 1, weil du nirgends sagst er soll mal ein größeres erstellen.
 
Doch, tut er schon. Und er sagt ja auch dass das "array" am Ende korrekten Inhalt hat. Mal abgesehen von allem was man bzgl. Klassen und so anders machen könnte, was gibt denn der println in dieswer Methode stringArray() aus ? Den richtigen String ?
 
Java:
        if(s == "neueSammlung"){
......
        }else if(s == "neuerEintrag"){
.......
            for(int i = 0; i < array.length; i++){
           
            Textfeld neuestextfeld = new Textfeld(20);
            MasterFrame.setConstraints(neuestextfeld,gbl_contentPanel,0,i,1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.WEST);
            contentPanel.add(neuestextfeld);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("neueEigenschaft")){
            JLabel text = new JLabel(Textfeld.getTextfelder()+1+". Eigenschaft");
            Textfeld neuestextfeld = new Textfeld(20);
            MasterFrame.setConstraints(neuestextfeld,gbl_contentPanel,0,1+Textfeld.getTextfelder(),1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);
            MasterFrame.setConstraints(text,gbl_contentPanel,1,1+Textfeld.getTextfelder(),1,1,0,0,0.0,0.0,5,5,5,5,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);
            contentPanel.add(neuestextfeld);
......

Hier ist der Fehler zu suchen:
Du erstellst ein Objekt deiner Klasse Textfeld (welches selbst ein JTextField ist) und fügst diese Objekt zum Panel hinzu.
Dein Textfeld selbst hat ein JTextField als Attribut und diese Objekt speicherst du in deinem Array. Sprich das was du am Schirm siehst und das was in deinem Array gespeichert ist sind 2 vollkommen unterschiedliche Objekte

PS: Strings sollten mit equals verglichen werden! Ein "==" Vergleich muss nicht immer richtig sein.
 

Zurück
Oben