Swing Variable in Actionlistener aufrufen

SchokoBons

Mitglied
Moin Leute,
ich scheitere gerade an einen eigentlich leichten Problem in meinen Programm: Ich erstelle eine Array in einer Actionlistener Methode. Jetzt will ich in einen zweiten Actionlistener die Array aufrufen, verändern und an eine weitere Methode weitergeben. Was wäre die beste Methode um dieses Problem beim Actionlistener zu lösen?
 

Anhänge

Das sieht mir fast nach einem Bug der Forensoftware aus ... evtl. kann der TE versuchen, noch einmal hier zu antworten - mit seiner Frage ...
 
Mh ja irgendwie bugt das ganz schön rum... Ich poste hier jetzt nochmal die komplette Frage:

Moin, ich bin Anfänger und verzweifle gerade bei dem Actionlistener eines Buttons. Das Programm erstellt einen Knopf, der beim betätigen eine char Array erstellt und anschließend zwei neue Knöpfe erschafft. Das Problem liegt darin, dass die beiden neuen Knöpfe bei Aktivierung mit der Array vom ersten Knopf arbeiten sollen, jedoch weiß ich nicht wie ich es schaffe diese char Array in diesern Fremden Actionlistenern Methoden aufzurufen.

Ich weiß nicht welche Code Teile noch relevant sind, deswegen schreibe ich mal das ganze Programm rein. Die Array, mit dem ich das Problem habe heißt "key". In den Actionlistenern von "button2" und "button3" kann ich nicht auf sie zugreifen und ich weiß nicht wie man bei so einer Art Methode das lösen kann.

Java:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Vigenère {

    public static void main(String[] args) {

        JFrame fenster = new JFrame();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setVisible(true);
        fenster.setSize(700, 500);
        fenster.setTitle("Vigenère");

        setupContent(fenster);

    }

    private static void setupContent(JFrame fenster) {
        // TODO Auto-generated method stub

        JPanel content = new JPanel();

        JButton button = new JButton("Ok");
        JButton button2 = new JButton("verschlüsseln");
        JButton button3 = new JButton("entschlüsseln");

        JLabel label = new JLabel("Gebe den Schlüssel ein");

        JTextField textField = new JTextField(30);

        content.add(label);
        content.add(textField);
        content.add(button);

        fenster.setContentPane(content);

        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                String schlüssel = textField.getText();
                char[] key = schlüssel.toCharArray(); // Array Key soll von anderen Methoden aufgerufen werden,

                textField.setText("");

                label.setText("Gebe den Text ein  ");
                button.setVisible(false);

                content.setLayout(null);

                content.add(button2);
                content.add(button3);
                button2.setBounds(75, 80, 250, 250);
                button3.setBounds((625 - 250), 80, 250, 250);
            }

        });

        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                int richtung = 1;

                String Text1 = textField.getText();
                char[] Text = Text1.toCharArray();
                char[] encrypted = crypt(Text, key, richtung); // Key wird nicht erkannt

            }

        });
        button3.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                int richtung = 0;

                String Text2 = textField.getText();
                char[] Text = Text2.toCharArray();
                char[] decrypted = crypt(Text, key, richtung);
            }

        });

    }

    public static char[] crypt(char[] Text, char[] key, int richtung) {
        char[] output = new char[Text.length];

        for (int i = 0; i < Text.length; i++) {

            if (richtung == 1) {
                int result = (Text[i] + key[i % key.length]) % 128;
                output[i] = (char) result;
            } else if (richtung == 0) {
                int result;
                if (Text[i] - key[i % key.length] < 0)
                    result = (Text[i] - key[i % key.length]) + 128;
                else
                    result = (Text[i] - key[i % key.length]) % 128;
                output[i] = (char) result;

            }
        }

        return output;

    }

}
 
@SchokoBons Du kannst für key in dem Fall keine lokale Variable verwenden. So etwas löst man mit Instanzvariablen, das setzt allerdings voraus, dass man auch eine Instanz hat; main sollte bei Anfängern grundsätzlich die einzig statische Methode im Programm sein.

Dann ein paar allgemeine Anmerkungen:
a) verwende im Quelltext möglichst nur ASCII. Umlaute, Akzente etc. führen nur zu Problemen - wie man an den Beiträgen oben gut sieht
b) verwende sinnvolle Bezeichner: button, button2 und button3 ist absolut nichtssagend.
c) verwende keine Parameter, die den grundsätzlichen Kontrollfluss einer Methode bestimmen. Mach aus crypt lieber zwei Methoden: encrypt und decrypt.

Zum letzten Punkt noch eine Anmerkung: tatsächlich wäre es in Deinem Fall auch möglich, einfach vorab einen Faktor (+1/-1) zu bestimmen, z. B. int faktor = richtung > 0 ? 1 : -1; und dann in der Schleife unabhängig von richtung zu berechnen:
Java:
output[i] = (char) ((Text[i] + faktor*key[i % key.length] + 128)  % 128);
 
Und damit auch klar ist warum das mit "key" nicht funktioniert:

Variablen haben einen Gültigkeitsbereich.
Java:
void someMethod() { // Beginn Gültigkeitsbereich 1
   
    int var1 = 42; // Variable ist im Gültigkeitsbereich 1
   
    if (...) { // Beginn Gültigkeitsbereich 2
        int var2 = var1; // var1 ist innerhalb ihres Gültigkeitsbereichs, var2 ist im Bereich 2
    } // Ende Gültigkeitsbereich 2, hier endet die Gültigkeit von var2
   
    int var3 = var2; // FEHLER!!! var2 ist hier nicht bekannt
   
} // Ende Gültigkeitsbereich 1, hier endet die Gültigkeit von var1 und von var3

void someOtherMethod() {
    int var4 = var1; // FEHLER!!! var1 ist hier nicht bekannt
}

Die Variablen 1 - 4 sind sogenannte lokale Variablen, weil sie nur lokal innerhalb einer Methode oder sogar in einem noch engeren Bereich (if()...) gültig sind.
 

Neue Themen


Zurück
Oben