Frage

Ich versuche, eine GUI in Java zu machen, etwas in diese Richtung mit:

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
      }
  }

Da ist in meiner buttonPanel Klasse Ich habe diese:

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);
        }
        }

}
}

Aber Netbeans gibt einen Fehler für die innere button Klasse, und ich weiß nicht, warum. Ich weiß auch nicht, wie richtig die setOval anrufen aus dieser Klasse der GUIApp Klasse. Was mache ich falsch?

War es hilfreich?

Lösung

Das Problem ist, dass, wenn Sie ActionListener implementieren Sie die Methode definieren müssen actionPerformed(ActionEvent e) ; Sie haben nicht, dass in Ihrer ButtonListener Klasse getan. Sie können nicht die Methode nichts Namen, den Sie möchten (wie Sie mit clickButton getan haben), so dass Sie nur Ihre clickButton Methode actionPerformed umbenennen sollte (und gehen Sie vor und fügen Sie auch eine @Override Anmerkung).

Um nun d.setOval aus Ihrer inneren Klasse zu nennen, d in Umfang sein muss, wenn die actionPerformed Methode aufgerufen wird. Es gibt ein paar Möglichkeiten, dies zu erreichen: Sie d eine Membervariable der Klasse machen könnte, oder Sie können Ihre ButtonListener als eine anonyme Klasse definieren

.

Zum Beispiel, wenn Sie d als Member-Variable gespeichert und dann Ihr Code würde wie folgt aussehen:

public class ButtonPanel {
 private GUIApp d;

 public ButtonPanel(GUIApp d) {
  this.d = d;
  // The rest of your code here...
 }
}

Oder könnten Sie eine anonyme Klasse wie diese verwenden:

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 ...
}

. Hinweis: Beachten Sie, wie ich für Objektgleichheit auch die Verwendung von == zu equals() geändert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top