Menü verschwindet durch .setText()

Gurkolomäus

Mitglied
Hallo liebe Community,
dieser Bug bereitet mir echt Kopfzerbrechen, da ich Menüs schon in einigen Java-Programmen erfolgreich verwendet habe, und noch nie ein solches Problem hatte. Der Code ist wie folgt:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import javax.swing.JFrame;

public class KryptoTool {

   public static void main(String[] arg){
        new KryptoTool();
   }
   
  private TextField originalText;
  private TextField keyText;
  private Button encryptButton, decryptButton;
  private EncryptListener EncryptWatcher;
  private JFrame frame = new JFrame();


  public char abc[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
      'Y', 'Z', 'Ä', 'Ö', 'Ü', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
      'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
      'x', 'y', 'z', 'ä', 'ö', 'ü', 'ß', '0', '1', '2', '3', '4', '5', '6',
      '7', '8', '9', ' ', '!','-', '.' }; //dynamisches Array, beliebig erweiterbar
  
  public KryptoTool() {
    
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(600,200);
  frame.setResizable(false);
  frame.getContentPane().setLayout(new GridLayout(3,3));
  frame.getContentPane().setBackground(new Color (0xB5D1FF));
  frame.getContentPane().add(new Label("hier den zu bearbeitenden Text einfügen:"));
  originalText = new TextField("");
  frame.getContentPane().add(originalText);
  frame.getContentPane().add(new Label("hier den Schlüssel einfügen:"));
  keyText = new TextField("");
  frame.getContentPane().add(keyText);
  encryptButton = new Button("Chiffrieren");
  frame.getContentPane().add(encryptButton);
  decryptButton = new Button("Dechiffrieren");
  frame.getContentPane().add(decryptButton);
  EncryptWatcher = new EncryptListener();
  encryptButton.addActionListener(EncryptWatcher);
  //Menüleiste
  JMenuBar bar = new JMenuBar();
  JMenu menu = new JMenu("Menü");
  JMenuItem CaesarChiffre = new JMenuItem("Caesar Chiffre");
  JMenuItem VigenereChiffre = new JMenuItem("Vigenère Chiffre");
  JMenuItem RSAChiffre = new JMenuItem("RSA Chiffre");
  
  //ActionListener der Menüleiste
  CaesarChiffre.addActionListener(new ActionListener(){
     @Override
     public void actionPerformed(ActionEvent e) {

     }
  });
  VigenereChiffre.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {

       }
  });
  RSAChiffre.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {

       }
  });
  
  menu.add(CaesarChiffre);
  menu.add(VigenereChiffre);
  menu.add(RSAChiffre);
  bar.add(menu);
  frame.setJMenuBar(bar);
  frame.setVisible(true);
  }

  public class EncryptListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String keyString = keyText.getText();
      char originalAsArray[] = originalText.getText().toCharArray();//Umwandlung der Eingabe in ein charArray
      int key = 0;
      try {
        key = Integer.valueOf(keyString);//Versuch, den key String in einen Integer Umzuwandeln
      } catch (NumberFormatException n) {//Wenn der key String keine Zahl (bzw. kein Integer) ist, feuert catch
        originalText.setText("Der Key muss eine Zahl sein");
        return;
      }
      char encrypted[] = new char[originalAsArray.length];//Array zum Speichern des verschlüsselten Textes wird erstellt

      for (int b = 0; b < originalAsArray.length; b++) {
        char c = originalAsArray[b];//für jeden char im zu verschlüsselnden CharArray wird die Schleife ausgeführt
        for (int i = 0; i < abc.length; i++) {
          if (c == abc[i]){//sucht den char im array abc[]
            int position = i;
            position += key;//der Schlüssel wird zum zu verschlüsselnden Buchstaben addiert
            position = position % abc.length;//der Modulo der Länge des Alphabets bzw. des Arrays wird berechnet, um innerhalb des Arrays zu bleiben
            while (position < 0) position += abc.length;//negative Moduloergebnisse werden ausgeschlossen
            encrypted[b] = abc[position];//dem verschlüsselten Zahlenwert wird der passende Buchstabe zugeordnet, und dieser wird im Array encrypted gespeichert
            break;
          } else if (i == abc.length - 1) {
            //char nicht im Alphabet bzw. im Array
            encrypted[b] = '?';
          }
        }
        
      }
      originalText.setText(String.valueOf(encrypted));//das charArray mit dem verschlüsselten Text wird als String im Eingabefeld ausgegeben
    }
  }
}

Abgesehen davon, dass das Programm natürlich noch nicht fertig ist, bereitet mir das Menü insofern Probleme, als dass der Reiter mit Caesar Chiffre, Viginere Chiffre und RSA Chiffre verschwindet, sobald der Button "Chiffrieren" gedrückt wurde.
Kommentiert man die Zeile
Java:
originalText.setText(String.valueOf(encrypted));//das charArray mit dem verschlüsselten Text
aus, tritt dieses Problem nicht auf. Ich hoffe jemand kennt die Ursache bzw. die Lösung für diesen Bug.
 
Zuletzt bearbeitet:
also bei mir bleibt das Menü da wo es sein sollte (ich habe einen Mac) versuche es mal auf einem anderen Rechner

Ps was ich persönlich sowieso cooler fände wäre wenn du eine JTabbedPane machen würdest und kein Menü aber das ist deine Entscheidung
 
Hab ich schon. Sowohl auf XP als auch auf Windows 7 Rechnern, bei allen tritt das Problem auf. Seltsam dass es auf einem Mac zu funktionieren scheint. Soll ich vllt mal einen Screenshot davon posten, was ich meine?
 
Du mischt AWT und Swing .. versuchs mal so
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

//Autoren: Simon Froitzheim, Michael Lomb, Felix Steinfurth
public class KryptoTool {

   public static void main(String[] arg){
        new KryptoTool();
   }

  private JTextField originalText;
  private JTextField keyText;
  private Button encryptButton, decryptButton;
  private EncryptListener EncryptWatcher;
  private JFrame frame = new JFrame();


  public char abc[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
      'Y', 'Z', 'Ä', 'Ö', 'Ü', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
      'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
      'x', 'y', 'z', 'ä', 'ö', 'ü', 'ß', '0', '1', '2', '3', '4', '5', '6',
      '7', '8', '9', ' ', '!','-', '.' }; //dynamisches Array, beliebig erweiterbar

  public KryptoTool() {

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(600,200);
  frame.setResizable(false);
  frame.getContentPane().setLayout(new GridLayout(3,3));
  frame.getContentPane().setBackground(new Color (0xB5D1FF));
  frame.getContentPane().add(new JLabel("hier den zu bearbeitenden Text einfügen:"));
  originalText = new JTextField("");
  frame.getContentPane().add(originalText);
  frame.getContentPane().add(new JLabel("hier den Schlüssel einfügen:"));
  keyText = new JTextField("");
  frame.getContentPane().add(keyText);
  encryptButton = new Button("Chiffrieren");
  frame.getContentPane().add(encryptButton);
  decryptButton = new Button("Dechiffrieren");
  frame.getContentPane().add(decryptButton);
  EncryptWatcher = new EncryptListener();
  encryptButton.addActionListener(EncryptWatcher);
  //Menüleiste
  JMenuBar bar = new JMenuBar();
  JMenu menu = new JMenu("Menü");
  JMenuItem CaesarChiffre = new JMenuItem("Caesar Chiffre");
  JMenuItem VigenereChiffre = new JMenuItem("Vigenère Chiffre");
  JMenuItem RSAChiffre = new JMenuItem("RSA Chiffre");

  //ActionListener der Menüleiste
  CaesarChiffre.addActionListener(new ActionListener(){
     @Override
     public void actionPerformed(ActionEvent e) {

     }
  });
  VigenereChiffre.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {

       }
  });
  RSAChiffre.addActionListener(new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent e) {

       }
  });

  menu.add(CaesarChiffre);
  menu.add(VigenereChiffre);
  menu.add(RSAChiffre);
  bar.add(menu);
  frame.setJMenuBar(bar);
  frame.setVisible(true);
  }

  public class EncryptListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String keyString = keyText.getText();
      char originalAsArray[] = originalText.getText().toCharArray();//Umwandlung der Eingabe in ein charArray
      int key = 0;
      try {
        key = Integer.valueOf(keyString);//Versuch, den key String in einen Integer Umzuwandeln
      } catch (NumberFormatException n) {//Wenn der key String keine Zahl (bzw. kein Integer) ist, feuert catch
        originalText.setText("Der Key muss eine Zahl sein");
        return;
      }
      char encrypted[] = new char[originalAsArray.length];//Array zum Speichern des verschlüsselten Textes wird erstellt

      for (int b = 0; b < originalAsArray.length; b++) {
        char c = originalAsArray[b];//für jeden char im zu verschlüsselnden CharArray wird die Schleife ausgeführt
        for (int i = 0; i < abc.length; i++) {
          if (c == abc[i]){//sucht den char im array abc[]
            int position = i;
            position += key;//der Schlüssel wird zum zu verschlüsselnden Buchstaben addiert
            position = position % abc.length;//der Modulo der Länge des Alphabets bzw. des Arrays wird berechnet, um innerhalb des Arrays zu bleiben
            while (position < 0) position += abc.length;//negative Moduloergebnisse werden ausgeschlossen
            encrypted[b] = abc[position];//dem verschlüsselten Zahlenwert wird der passende Buchstabe zugeordnet, und dieser wird im Array encrypted gespeichert
            break;
          } else if (i == abc.length - 1) {
            //char nicht im Alphabet bzw. im Array
            encrypted[b] = '?';
          }
        }

      }
      originalText.setText(String.valueOf(encrypted));//das charArray mit dem verschlüsselten Text wird als String im Eingabefeld ausgegeben
    }
  }
}

analog dazu solltest du dich für eine Art entscheiden!
 

Zurück
Oben