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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top