GUI in Java, arbeitet Privatunterricht für Zuhörer nicht
-
02-10-2019 - |
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?
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