Video: Section 2 2024
Dit is groot nieuws! In Java kun je een klas in een andere klas definiëren! Hier bevat de
GameFrame
-klasse een klasse met de naam
MyActionListener
.
java importeren. awt. FlowLayout;
java importeren. awt. evenement. ActionEvent;
java importeren. awt. evenement. ActionListener;
java importeren. util. Willekeurig;
javax importeren. schommel. JButton;
javax importeren. schommel. JFrame;
javax importeren. schommel. JLabel;
javax importeren. schommel. JTextField;
class GameFrame breidt JFrame uit {
eigen statische laatste lange serialVersionUID = 1L;
int randomNumber = new Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nieuw JTextField (5);
JButton-knop = nieuwe JButton ("Guess");
JLabel-label = nieuwe JLabel (numGuesses + "guesses");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (nieuwe FlowLayout ());
toe te voegen (textField);
toe te voegen (toets);
toe te voegen (label);
knop. addActionListener (nieuwe MyActionListener () );
pack ();
setVisible (true);
}
klasse MyActionListener implementeert ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField . getText ();
if (Integer. ParseInt (textFieldText) == randomNumber) {
knop. setEnabled (false);
textField. setText (textField. getText () + "Ja!");
textField. setEnabled (false);
} else {
textField. setText ("");
textField. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses";
label. setText (numGuesses + guessWord);
}
}
}
De
MyActionListener
-klasse hierboven is een innerlijke klasse. Een innerlijke klasse lijkt veel op elke andere klasse. Maar binnen de code van een innerlijke klasse kun je verwijzen naar de velden van de omsluitende klasse. Diverse statements binnen
MyActionListener
gebruiken bijvoorbeeld de naam
textField
en
textField
is gedefinieerd in de enclassing
GameFrame
-klasse.
Merk op dat de bovenstaande code slechts één keer de klasse
MyActionListener
gebruikt. (Het enige gebruik is tijdens een oproep naar
knop addActionListener
.) Dus, heb je echt een naam nodig voor iets dat maar één keer wordt gebruikt? Nee, dat doe je niet. U kunt de hele definitie van de binnenste klasse vervangen door de knop
.addActionListener
. Wanneer je dit doet, heb je een anonieme innerlijke klasse. Zo werkt het.
java importeren. awt. FlowLayout;
java importeren. awt. evenement. ActionEvent;
java importeren. awt. evenement. ActionListener;
java importeren. util. Willekeurig;
javax importeren. schommel. JButton;
javax importeren. schommel. JFrame;
javax importeren. schommel. JLabel;
javax importeren. schommel. JTextField;
class GameFrame breidt JFrame uit {
eigen statische laatste lange serialVersionUID = 1L;
int randomNumber = new Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nieuw JTextField (5);
JButton-knop = nieuwe JButton ("Guess");
JLabel-label = nieuwe JLabel (numGuesses + "guesses");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (nieuwe FlowLayout ());
toe te voegen (textField);
toe te voegen (toets);
toe te voegen (label);
knop. addActionListener (nieuwe ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField. getText ();
if (Geheel getal. parseInt (textFieldText) = = randomNumber) {
knop.setEnabled (false);
textField. setText (textField. getText () + "Yes!");
textField. setEnabled (false);
} else {< textField. SetText ("");
textField. RequestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses"; < label. SetText (numGuesses + guessWord);
}
}
);
pack (); setVisible (true);
}
}
Binnenklassen zijn goed voor zaken als gebeurtenishandlers, zoals de
actionPerformed
-methode. Het moeilijkste van een
anonieme
innerlijke klasse is het bijhouden van de haakjes, de accolades en de insprong. Een bescheiden advies: begin met het schrijven van code zonder innerlijke klassen. Later, wanneer je je verveelt met gewone Java-lessen, experimenteer je door enkele van je gewone lessen in innerlijke klassen te veranderen.