2017-06-24 1 views
0

J'essaie d'exécuter mon JButton ActionListener dans une classe différente de celle de mon interface graphique. J'ai donc le bouton qui marche, mais je ne peux pas "accéder" aux TextFields, ils sont juste "vides" quand je veux y accéder.Exécuter JButton ActionListener dans une classe différente

Voilà ma classe GUI:

public class CaeserGUI extends JFrame { 

    JPanel contentPane; 
    private JTextField txt_input; 
    private JTextField number_input; 
    private JButton btn_translate; 
    private JTextArea txt_output; 
    private JTextField txt_input2; 
    private JTextField number_input2; 
    private JTextArea txt_output2; 

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

    /** 
    * Create the frame. 
    */ 
    public CaeserGUI() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     txt_input = new JTextField(); 
     txt_input.setBounds(10, 38, 363, 20); 
     contentPane.add(txt_input); 
     txt_input.setColumns(10); 

     number_input = new JTextField(); 
     number_input.setBounds(383, 38, 41, 20); 
     contentPane.add(number_input); 
     number_input.setColumns(10); 

     JTextPane txtpnZubersetzenderSatz = new JTextPane(); 
     txtpnZubersetzenderSatz.setText("Zu \u00FCbersetzender Satz:"); 
     txtpnZubersetzenderSatz.setBounds(10, 11, 126, 20); 
     contentPane.add(txtpnZubersetzenderSatz); 

     JTextPane txtpnVerschiebung = new JTextPane(); 
     txtpnVerschiebung.setText("Verschiebung:"); 
     txtpnVerschiebung.setBounds(349, 11, 75, 20); 
     contentPane.add(txtpnVerschiebung); 

     txt_output = new JTextArea(); 
     txt_output.setBounds(10, 69, 414, 40); 
     contentPane.add(txt_output); 

     JTextPane txtpnZuDechiffrierenderSatz = new JTextPane(); 
     txtpnZuDechiffrierenderSatz.setText("Zu dechiffrierender Satz:"); 
     txtpnZuDechiffrierenderSatz.setBounds(10, 120, 126, 20); 
     contentPane.add(txtpnZuDechiffrierenderSatz); 

     txt_input2 = new JTextField(); 
     txt_input2.setColumns(10); 
     txt_input2.setBounds(10, 147, 363, 20); 
     contentPane.add(txt_input2); 

     number_input2 = new JTextField(); 
     number_input2.setColumns(10); 
     number_input2.setBounds(383, 147, 41, 20); 
     contentPane.add(number_input2); 

     JTextPane textPane_1 = new JTextPane(); 
     textPane_1.setText("Verschiebung:"); 
     textPane_1.setBounds(349, 120, 75, 20); 
     contentPane.add(textPane_1); 

     txt_output2 = new JTextArea(); 
     txt_output2.setBounds(10, 176, 414, 40); 
     contentPane.add(txt_output2); 

     ActionListener actionListener = new ButtonListener(number_input, number_input2, btn_translate, txt_output, txt_input, txt_input2, txt_output2); 

     btn_translate = new JButton("\u00DCbersetzen"); 
     btn_translate.addActionListener(actionListener); 
     btn_translate.setBounds(10, 227, 414, 23); 
     contentPane.add(btn_translate); 
    } 
} 

Et c'est ma classe Listener:

public class ButtonListener implements ActionListener{ 

    private JTextField txt_input; 
    private JTextField number_input; 
    private JButton btn_translate; 
    private JTextArea txt_output; 
    private JTextField txt_input2; 
    private JTextField number_input2; 
    private JTextArea txt_output2; 

    public ButtonListener(JTextField txt_input, JTextField number_input, 
          JButton btn_translate, JTextArea txt_output, 
          JTextField txt_input2, JTextField number_input2, 
          JTextArea txt_output2){ 

     this.txt_input = txt_input; 
     this.number_input = number_input; 
     this.btn_translate = btn_translate; 
     this.txt_output = txt_output; 
     this.txt_input2 = txt_input2; 
     this.number_input2 = number_input2; 
     this.txt_output2 = txt_output2; 
    } 

    public void actionPerformed(ActionEvent e){ 
     if(txt_input.getText().equals("")){ 
      System.exit(0); 
     }else{ 
     } 
    } 
} 

Lorsque j'appuie sur le bouton, ma sortie de programme, même quand j'écrire quelque chose dans le champ de texte. J'ai lu beaucoup d'autres messages, mais je n'ai pas réussi à le faire fonctionner.

J'apprécie chaque réponse.

Répondre

1

Vous semblez être passer les paramètres dans l'ordre incorrect (pour autant que je peux dire, sur la base des conventions de dénomination)

+---------------------------+--------------------------+ 
| ActionListener Parameters | The Order You're Passing | 
+---------------------------+--------------------------+ 
| txt_input     | number_input    | 
| number_input    | number_input2   | 
| btn_translate    | btn_translate   | 
| txt_output    | txt_output    | 
| txt_input2    | txt_input    | 
| number_input2    | txt_input2    | 
| txt_output2    | txt_output2    | 
+---------------------------+--------------------------+ 

Cela signifie, lorsque vous inspectez la valeur de txt_input dans votre ActionListener, vous cherchez réellement à la valeur number_input ... cela me permet de problèmes cris

Ma recommandation « générale » serait de créer un interface qui fournissent des accesseurs, avec de meilleurs noms que « texte » et « text2 » , afin que vous puissiez mieux différencier leur signification. Je dois CaeserGUI mettre en œuvre cette interface et passer ensuite à l'ActionListener, qui a une seule référence à une instance dudit interface

Évitez d'utiliser null mises en page, mise en page de pixels parfaits sont une illusion dans la conception de l'interface utilisateur moderne. Il y a trop de facteurs qui affectent la taille individuelle des composants, dont vous ne pouvez contrôler aucun. Swing a été conçu pour fonctionner avec les gestionnaires de mise en page au cœur, en éliminant ceux-ci conduira à aucune fin des problèmes et des problèmes que vous passerez de plus en plus de temps à corriger

Si vous pensez que je suis trop réactif, c'est ce qui se passe quand je lance votre code sur mon PC

Bad Layout

Voyez comment le « caret » dans le second champ est cassé?

Je recommanderais d'utiliser JLabel s pour fournir des invites aux champs au lieu de définir leur texte, car c'est juste déroutant. Voir How to Use Labels pour plus de détails

Les composants tels que JTextPane profitent vraiment été enveloppé dans un JScrollPane, ce qui permettra à l'utilisateur de voir le texte lors de son expansion au-delà des limites visuelles du composant. Voir How to Use Scroll Panes pour plus de détails

+0

ty, ouais je me suis trompé ... D: Mais je vais essayer l'interface aussi: D – itsPauV

+0

Ce ne sera pas la dernière fois que vous mélangez les paramètres: P – MadProgrammer

+0

Merci, ces étiquettes mieux travailler: D – itsPauV