GUI en Java, des cours privés pour l'auditeur ne fonctionne pas
-
02-10-2019 - |
Question
Je suis en train de faire une interface graphique en Java, en utilisant quelque chose le long de ces lignes:
public class GUIApp
{
DrawingPanel dp;
buttonPanel bp;
ova = Oval;
public GUIApp()
{
JFrame win = new JFrame("Drawing App");
dp = new DrawingPanel();
bp = new buttonPanel(this);
//Settings for panels and frame
ova = new Oval(100,100,100,100);
}
public void setOval(int c){
//Change color of oval
}
}
Alors dans ma classe panneauBoutons J'ai ceci:
public class ButtonPanel extends JPanel
{
private JButton btnRed, btnGreen, btnBlue;
public ButtonPanel(GUIApp d)
{
ButtonListener listener = new ButtonListener();
btnRed = new JButton("Red");
btnGreen = new JButton("Green");
btnBlue = new JButton("Blue");
btnRed.addActionListener(listener);
btnGreen.addActionListener(listener);
btnBlue.addActionListener(listener);
setBackground(Color.lightGray);
GridLayout grid = new GridLayout(3,1);
add(btnRed,grid);
add(btnGreen,grid);
add(btnBlue,grid);
}
private class ButtonListener implements ActionListener{
public void clickButton(ActionEvent event) {
Object location = event.getSource();
if (location == btnRed){
d.setOval(1);
}
else if(location == btnGreen){
d.setOval(2);
}
else if(location == btnBlue){
d.setOval(3);
}
}
}
}
Mais NetBeans donne une erreur pour la classe buttonListener intérieure, et je ne sais pas pourquoi. Je ne sais pas non comment appeler correctement le setOval à partir de cette classe à la classe GUIApp. Qu'est-ce que je fais mal?
La solution
Le problème est que lorsque vous implémentez ActionListener
vous devez définir la méthode actionPerformed(ActionEvent e)
; vous ne l'avez pas fait dans votre classe ButtonListener
. Vous ne pouvez pas nommer le méthode que vous voulez (comme vous l'avez fait avec clickButton
), vous devez simplement renommer votre méthode de clickButton
à actionPerformed
(et aller de l'avant et ajouter une annotation @Override
aussi).
pour appeler d.setOval
à partir de votre classe interne, d
doit être portée lorsque la méthode actionPerformed
est appelée. Il y a deux manières de réaliser ceci, vous pourriez faire d
une variable membre de votre classe, ou vous pouvez définir votre ButtonListener
comme une classe anonyme
Par exemple, si vous avez enregistré d
comme une variable de membre alors votre code ressemblerait à ceci:
public class ButtonPanel {
private GUIApp d;
public ButtonPanel(GUIApp d) {
this.d = d;
// The rest of your code here...
}
}
Ou, vous pouvez utiliser une classe anonyme comme ceci:
public ButtonPanel(GUIApp d) {
ActionListener listener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent event) {
Object location = event.getSource();
if (btnRed.equals(location)) {
d.setOval(1);
} else if (btnGreen.equals(location)) {
d.setOval(2);
} else if (btnBlue.equals(location)) {
d.setOval(3);
}
}
};
// The rest of your constructor code here ...
}
Remarque:. Remarquez que j'ai aussi changé l'utilisation de ==
à equals()
pour l'égalité des objets