Video: Chicago Vacation Travel Guide | Expedia 2024
Här är stora nyheter! I Java kan du definiera en klass inuti en annan klass! Här innehåller klassen
GameFrame
en klass som heter
MyActionListener
.
importera java. AWT. FlowLayout;
importera java. AWT. händelse. Action;
importera java. AWT. händelse. Action;
importera java. util. Slumpmässig;
importera javax. svänga. JButton;
importera javax. svänga. JFrame;
importera javax. svänga. JLabel;
importera javax. svänga. JTextField;
class GameFrame utökar JFrame {
privata statiska slutliga långa serialVersionUID = 1L;
int randomNumber = nytt slumpmässigt (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nytt JTextField (5);
JButton-knapp = ny JButton ("Guess");
JLabel label = nytt JLabel (numGuesses + "gissningar");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (new FlowLayout ());
lägga (textfield);
lägga (knapp);
lägga (etikett);
-knappen. addActionListener (nya MyActionListener () );
pack ();
setVisible (true);
}
klass MyActionListener implementerar ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField . gettext ();
om (Integer. ParseInt (textFieldText) == randomNumber) {
-knappen. setEnabled (false);
textfield. setText (textField. getText () + "Yes!");
textfield. setEnabled (false);
} annars {
textField. setText ("");
textfield. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Gissa": "gissningar";
etikett. setText (numGuesses + guessWord);
}
}
}
Klassen
MyActionListener
ovan är en inre klass. En inre klass är mycket som någon annan klass. Men inom en inre klassens kod kan du referera till de omgivande klassens fält. Exempelvis används flera påståenden inom
MyActionListener
med namnet
textField
och
textField
i klassen
GameFrame
.
Observera att koden ovan använder klassen
MyActionListener
endast en gång. (Den enda användningen är i ett samtal till
-knappen. AddActionListener
.) Så behöver du verkligen ett namn på något som bara används en gång? Nej, det gör du inte. Du kan ersätta hela definitionen av den inre klassen inom samtalet till
-knappen.addActionListener
. När du gör det har du en anonym inre klass. Så här fungerar det.
importera java. AWT. FlowLayout;
importera java. AWT. händelse. Action;
importera java. AWT. händelse. Action;
importera java. util. Slumpmässig;
importera javax. svänga. JButton;
importera javax. svänga. JFrame;
importera javax. svänga. JLabel;
importera javax. svänga. JTextField;
class GameFrame utökar JFrame {
privata statiska slutliga långa serialVersionUID = 1L;
int randomNumber = nytt slumpmässigt (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nytt JTextField (5);
JButton-knapp = ny JButton ("Guess");
JLabel label = nytt JLabel (numGuesses + "gissningar");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (new FlowLayout ());
lägga (textfield);
lägga (knapp);
lägga (etikett);
-knappen. addActionListener (nya ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
StringtextFieldText = textField. getText ();
om (heltal. parseInt (textFieldText) = = randomNumber) {
-knappen. setEnabled (false);
textField. setText (textField. getText () + "Yes!");
textField. setEnabled (false);
} annars {< textField. SetText ("");
textField. RequestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Gissa": "gissningar"; < etikett. SetText (numGuesses + guessWord);
}
}
);
pack (); setVisible (true);
}
}
Inre klasser är bra för saker som händelsehanterare, till exempel metoden
actionPerformed
. Det svåraste med en
anonym
inre klass håller koll på parenteserna, de krökta axlarna och indrymmet. Vissa ödmjuka råd: Börja med att skriva kod utan några inre klasser. Senare, när du blir uttråkad med vanliga Java-klasser, försök genom att ändra några av dina vanliga klasser till inre klasser.