Vidéo: JAVA (Intermédiaire) - 38 - Création d'une instance d'une classe interne (1/2) 2024
Voici de grandes nouvelles! En Java, vous pouvez définir une classe à l'intérieur d'une autre classe! Ici, la classe
GameFrame
contient une classe nommée
MyActionListener
.
importer java. awt. FlowLayout;
importer java. awt. un événement. ActionEvent;
importer java. awt. un événement. ActionListener;
importer java. util. Au hasard;
importer javax. balançoire. JButton;
importer javax. balançoire. JFrame;
importer javax. balançoire. JLabel;
importer javax. balançoire. JTextField;
classe GameFrame étend JFrame {
private static final long serialVersionUID = 1L;
int randomNumber = new Aléatoire (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nouveau JTextField (5);
Bouton JButton = nouveau JButton ("Deviner");
JLabel label = nouveau JLabel (numGuesses + "devine");
public GameFrame () {
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout (nouveau FlowLayout ());
ajouter (textField);
ajouter (bouton);
ajouter (étiquette);
. addActionListener (new MyActionListener () );
pack ();
setVisible (true);
}
class MyActionListener implémente ActionListener {
@Override
public void actionPerformed (ActionEvénement e) {
Chaîne textFieldText = textField . getText ();
if (Entier, parseInt (textFieldText) == randomNumber) {
. setEnabled (faux);
textField. setText (textField.getText () + "Oui!");
textField. setEnabled (faux);
} else {
textField. Définir le texte("");
textField. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Deviner": "devine";
étiquette. setText (numGuesses + guessWord);
}
}
}
La classe
MyActionListener
ci-dessus est une classe interne. Une classe interne ressemble beaucoup à n'importe quelle autre classe. Mais dans le code d'une classe interne, vous pouvez vous référer aux champs de la classe englobante. Par exemple, plusieurs instructions à l'intérieur de
MyActionListener
utilisent le nom
textField
, et
textField
est défini dans la classe
GameFrame
.
Notez que le code ci-dessus utilise la classe
MyActionListener
une seule fois. (La seule utilisation est dans un appel au bouton
addActionListener
.) Alors, avez-vous vraiment besoin d'un nom pour quelque chose qui n'est utilisé qu'une seule fois? Non, vous ne le faites pas. Vous pouvez remplacer la définition complète de la classe interne dans l'appel au bouton
.addActionListener
. Lorsque vous faites cela, vous avez une classe interne anonyme. Voici comment cela fonctionne.
importer java. awt. FlowLayout;
importer java. awt. un événement. ActionEvent;
importer java. awt. un événement. ActionListener;
importer java. util. Au hasard;
importer javax. balançoire. JButton;
importer javax. balançoire. JFrame;
importer javax. balançoire. JLabel;
importer javax. balançoire. JTextField;
classe GameFrame étend JFrame {
private static final long serialVersionUID = 1L;
int randomNumber = new Aléatoire (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nouveau JTextField (5);
Bouton JButton = nouveau JButton ("Deviner");
JLabel label = nouveau JLabel (numGuesses + "devine");
public GameFrame () {
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout (nouveau FlowLayout ());
ajouter (textField);
ajouter (bouton);
ajouter (étiquette);
. addActionListener (new ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
Chaîne textFieldText = textField.getText ();
if (Entier.parseInt (textFieldText) = = randomNumber) { bouton setEnabled (faux);
textField.setText (textField.getText () + "Oui!");
textField.setEnabled (faux);
} else {< textField.setText ("");
textField. RequestFocus ();
}
numGuesses ++;
Chaîne guessWord = (numGuesses == 1)? "Deviner": "devine"; < label setText (numGuesses + guessWord);
}
}
);
pack ();
setVisible (true); }
}
Les classes internes sont bonnes pour les choses comme les gestionnaires d'événements, tels que la méthode
actionPerformed
. La chose la plus difficile à propos d'une classe interne
anonymous
est de garder une trace des parenthèses, des accolades et de l'indentation. Un humble conseil: commencez par écrire du code sans aucune classe interne. Plus tard, lorsque vous vous ennuierez avec les classes Java ordinaires, expérimentez en transformant certaines de vos classes ordinaires en classes internes.