addActionListener zeigt keine Wirkung

Der_Falke_

Mitglied
Hallo liebe Community,

ich habe vor kurzem mit dem programmieren von richtigen Programmen von Java angefangen, habe jedoch schon einige Erfahrung mit Java aus vorherigen Programmierungen wie z.B. Plugins gesammelt.
Da ich beim programmieren von Anwendungen jedoch noch recht frisch bin habe ich eine Frage. Ich habe ein JFrame mit Buttons erstellt und allem Texturen gegeben. Jetzt möchte ich fortfahren. Dazu soll der Anwender auf einen der Buttons klicken. Jedoch funktioniert das adden der Buttons zu dem ActionListener nicht. Ich habe mir bereits einige Sachen im Netz angeschaut, doch ich habe meinen Fehler nicht gefunden. Das ActionEvent an sich wird ausgeführt, doch wenn ich auf einen der Buttons klicke wird der jeweilige Code für den Button nicht ausgeführt. Ich denke mal das die Buttons nicht dem ActionListener hinzugefügt worden sind, doch wo liegt mein Fehler?

Ich würde mich über Antworten sehr freuen!

Hier mein Code:
[Java]public class Frame extends JFrame implements ActionListener {

private JButton startButton;
private JButton optionenButton;
private JButton schliessenButton;


public static void main(String[] args) throws IOException {
Frame fenster = new Frame("MineJump");
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setSize(1400,800);
fenster.setResizable(false);

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
fenster.setBounds((screenSize.width-1400)/2, (screenSize.height-800)/2, 1400, 800);

Image icon = new ImageIcon(Frame.class.getResource("/Images/icon.png")).getImage();
fenster.setIconImage(icon);
fenster.setVisible(true);
}



public Frame(String titel) {
super(titel);

JPanel panel = new JPanel();

JLabel background = new JLabel(new ImageIcon(Frame.class.getResource("/Images/menu.png")));
background.setBounds(0,0,1400,800);
panel.add(background);

panel.setLayout(null);


JButton startButton = new JButton("Start");
JButton optionenButton = new JButton("Optionen");
JButton schliessenButton = new JButton("Schliessen");

startButton.setBounds(300, 180, 798, 80);
startButton.setIcon(new ImageIcon(Frame.class.getResource("/Images/startButton.png")));
startButton.setRolloverIcon(new ImageIcon(Frame.class.getResource("/Images/startButtonMouseOver.png")));
startButton.setBorderPainted(false);
startButton.addActionListener(this);

optionenButton.setBounds(300, 320, 798, 80);
optionenButton.setIcon(new ImageIcon(Frame.class.getResource("/Images/optionenButton.png")));
optionenButton.setRolloverIcon(new ImageIcon(Frame.class.getResource("/Images/optionenButtonMouseOver.png")));
optionenButton.setBorderPainted(false);
optionenButton.addActionListener(this);

schliessenButton.setBounds(300, 460, 798, 80);
schliessenButton.setIcon(new ImageIcon(Frame.class.getResource("/Images/schliessenButton.png")));
schliessenButton.setRolloverIcon(new ImageIcon(Frame.class.getResource("/Images/schliessenButtonMouseOver.png")));
schliessenButton.setBorderPainted(false);
schliessenButton.addActionListener(this);

add(startButton);
add(optionenButton);
add(schliessenButton);

add(panel);
}



public void actionPerformed(ActionEvent e) {
if(e.getSource() == startButton) {
System.out.println("klappt");
startButton.setBounds(0,0,0,0);
optionenButton.setBounds(0,0,0,0);
schliessenButton.setBounds(0,0,0,0);
} else if(e.getSource() == optionenButton) {
System.out.println("3");
} else if(e.getSource() == schliessenButton) {
System.exit(0);
}
}[/Java]
 

Java20134

Bekanntes Mitglied
Als erstes würde ich die Buttons mal dem JPanel und nicht dem JFrame hinzufügen (Z.58-60). Und zweitens: Du musst zum Beispiel in Zeile 29 nicht Frame.class schreiben, da du keine statische Methode/Konstruktor hast. Deshalb kannst du auch einfach getClass() schreiben!
 

Harry Kane

Top Contributor
Ein Klassiker.
Du legst im Konstruktor von Frame drei neue JButton Instanzen als lokale Variablen an und fügst denen den ActionListener hinzu. Dies sind aber andere Objekte als die 3 JButton Instanzvariablen! Deshalb schlägt der Vergleich in der actionPerformed fehl.
Ausserdem solltest du eine eigene Klasse nie wie eine java-Standardklasse benennen.
 

Flown

Administrator
Mitarbeiter
Also dein Code selbst hat viel Verbesserungspotential.

- Leite nicht von JFrame ab, wenn du nicht dessen Verhalten änderst (tust du nicht)
- Ich würde deine Klasse nicht von ActionListener ableiten lassen (das geht auch mit einer inneren Klasse)
- LayoutManager verwenden (kein null-Layout)
- JFrame zentriert man einfach mit: frame.setLocationRelativeTo(null);
- Vom Stil her: englische Bezeichner verwenden.
- Buttons brauchen keinen gemeinsamen ActionListener, das geht auch wenn du sie auf mehr verteilst, somit sparst du dir die Frage welcher Button gedrückt wurde.
- Lass dein frame erst ganz zum Schluß anzeigen, wenn du alle Komponenten hinzugefügt hast (setVisible(true))
- Starte deine Gui in der main-Methode mit:
Java:
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    // new Frame("Titel");
  }
});
 

Java20134

Bekanntes Mitglied
Eine Frage zu deinen Punkten: Es ist doch nicht falsch, wenn man wie dort die Klasse von JFrame ableitet. Oder was meinst du mit Veränderungen?
 

Flown

Administrator
Mitarbeiter
Es ist nicht falsch, eher ein Bad Smell hätt ich gesagt. Du veränderst das Verhalten nicht von JFrame.

Analoges Beispiel:

Java:
class Car {
  private String brand;
  public Car(String brand) {
    this.brand = brand;
  }
  public String getBrand() {
    return brand;
  }
  public void setBrand(String brand) {
    this.brand = brand;
  }
}

Normalerweise würde man diese Klasse so verwenden:

Java:
Car vw = new Car("VW");
Car merceds = new Car("Mercdes");

Hingegen du würdest es so verwenden:

Java:
class MyCar extends Car {
  public MyCar(String brand) {
    super(brand);
  }
}

Mit:

Java:
MyCar vw = new MyCar ("VW");
MyCar merceds = new MyCar ("Mercdes");

Du hast genau das Selbe erzeugt mit deiner Frame Klasse.

Hingegen wenn du jetzt sowas machen würdest, dann würdest du das Verhalten der Klasse ändern:

Java:
class VWCar extends Car {
  public VWCar(String brand) {
    // Ignore input
    super("VW");
  }
  @Override
  public void setBrand(String brand) {
    // Do nothing
  }
}

Ich hoffe das war jetzt verständlich.
 
Zuletzt bearbeitet:

Der_Falke_

Mitglied
@Java20134 Ich habe die Buttons bewusst dem Frame hinzugefügt da ich sonst das Problem habe das sie von dem Hintergrund überschrieben werden. (Bzw. Der Start Button wird zwar angezeigt doch Optionen und Schliessen erst wenn man drüber fährt)
Und: Aber es ist doch trotzdem möglich Frame.class zu schreiben, oder gibt es einen bestimmten Grund warum man eher getClass() nehmen sollte?

@HarryKane Okay

@Flown
- Verbesserungspotenzial:
Auf alle Fälle. Ich versuche immer die besten Wege zu finden, doch oft mache ich es so, dass ich es erst einmal mit funktionierenden Methoden mache und später verbessere oder in anderen Projekten besser umsetze.
- LayoutManager:
Ich habe bis vor kurzem ein Layout verwendet, doch das wie schon gesagt die Buttons überschrieben worden sind habe ich es dann so gemacht das ich das Layout null gemacht habe und die Buttons dann direkt dem Frame hinzufüge, da ich so finde ich mehr Möglichkeiten habe und nicht an ein festes Layout gebunden bin.
-Zentrieren des Frames:
Danke, ich habe die neue Methode eingebaut, die ist wesentlich einfacher, ich hatte jedoch nur diese gefunden, bzw. dann nicht weiter gesucht ^^"
- Starten der main Methode:
Was bedeutet der Code?
Wie muss ich ihn verstehen?
Was bewirkt er?

Lösung:
Danke an alle die geantwortet haben!
Ich habe jetzt diese Methode verbaut:
[Java]startButton.setBounds(300, 180, 798, 80);
startButton.setIcon(new ImageIcon(Frame.class.getResource("/Images/startButton.png")));
startButton.setRolloverIcon(new ImageIcon(Frame.class.getResource("/Images/startButtonMouseOver.png")));
startButton.setBorderPainted(false);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("klawdawd");
}
});[/Java]
Flown hatte gesagt das jeder Button auch einen eigenen ActionListener haben kann. Das hat mir wieder so ein wenig auf die Sprünge geholfen. Ich habe diese Methode schon mal im Internet gesehen, doch fand das ich insgesamt dann zu viel Code haben könnte, da ich für jeden Button dann erst das schreiben muss. Diese Methode funktioniert perfekt!
Danke für eure Hilfe!
 

Flown

Administrator
Mitarbeiter
Wenn man es gleich richtig programmiert ist das nur die Hälfte der Arbeit, dass kann ich dir versichern.

Das mit dem Starten meinte ich so. So läuft deine eigene Anwendung nicht direkt auf dem AWT Thread sondern in einem eigenen. Der Vorteil ist, dass man einfacher die GUI updaten kann (braucht man eher für Concurrency in Swing). Doch ist es nicht schlecht es gleich zu machen.

Java:
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Test {
  
  public Test() {
    JFrame frame = new JFrame("Test");
    frame.setLocationByPlatform(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JLabel("Test"));
    frame.pack();
    frame.setVisible(true);
  }
  
  public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new Test();
      }
    });
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C addActionListener(this) - Fehlermeldung Java Basics - Anfänger-Themen 8
J button.addActionListener(this); - Welches this ist gemeint? Java Basics - Anfänger-Themen 7
M JPanel.addActionListener Java Basics - Anfänger-Themen 5
H addActionListener und setActionCommand ohne Wirkung Java Basics - Anfänger-Themen 2
D addActionListener Java Basics - Anfänger-Themen 28
S Menü addActionListener Java Basics - Anfänger-Themen 11
J wo finde ich die methode addactionlistener in der api ? Java Basics - Anfänger-Themen 5
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
M Override zeigt keinen Effekt Java Basics - Anfänger-Themen 9
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
K Warum zeigt dieser reguläre Ausdruck true an? Java Basics - Anfänger-Themen 1
K Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an. Java Basics - Anfänger-Themen 8
T ComboBox getValue() zeigt null Java Basics - Anfänger-Themen 7
chocobear26 Interface JOptionPane - Dialog_Fenster zeigt immer vorherige Eingabe an. Java Basics - Anfänger-Themen 4
A BufferedImage zeigt nur schwarz Java Basics - Anfänger-Themen 3
H Collections JTree remove zeigt keinen Effekt! Java Basics - Anfänger-Themen 8
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
L Namensliste mit Array zeigt nicht den gewünschten Inhalt Java Basics - Anfänger-Themen 12
S awt: paint Methode zeigt nichts an Java Basics - Anfänger-Themen 9
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
snipesss IDE zeigt keine Fehler an, Programm wird jedoch nicht ausgeführt. Java Basics - Anfänger-Themen 18
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
Anfänger2011 Frame zeigt nicht gewünschtes Ergebnis an ... Java Basics - Anfänger-Themen 5
D Compiler-Fehler NullPointerExeption aber Ecplise zeigt keine Fehler an?! Java Basics - Anfänger-Themen 8
P Compiler-Fehler wieso zeigt der compiler ein else without if? Java Basics - Anfänger-Themen 3
Z Lottoprogramm - Zeigt manchmal nur 5 Zahlen statt 6 an? Java Basics - Anfänger-Themen 4
J Umgebungsvariable Programmfenster zeigt kein Bild an Java Basics - Anfänger-Themen 1
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
J Slideshow zeigt bilder nicht an Java Basics - Anfänger-Themen 3
A Hilfe Java1 Uni : Code zeigt Fehler Java Basics - Anfänger-Themen 8
D Eclipse Juno zeigt Bild nicht bei Run Java Basics - Anfänger-Themen 3
D Erstellte Jar datei zeigt keine Bilder an Java Basics - Anfänger-Themen 5
B Eclipse zeigt code als falsch an Java Basics - Anfänger-Themen 19
S Speicheradresse auf die eine Referenz zeigt ausgeben Java Basics - Anfänger-Themen 12
P javaw.exe zeigt trotzdem Terminal/CmdPrompt Java Basics - Anfänger-Themen 2
Y add Funktion für GridBagLayout zeigt Button nicht an Java Basics - Anfänger-Themen 3
S Warum zeigt das Label nichts an??? Java Basics - Anfänger-Themen 9
S Shell zeigt keine Scrollbars Java Basics - Anfänger-Themen 2
Z JScrollPane zeigt Zeit als Datum Java Basics - Anfänger-Themen 5
S Teil derGUI zeigt sich erst später Java Basics - Anfänger-Themen 2
K TextField zeigt nicht an Java Basics - Anfänger-Themen 4
I JPanel zeigt nichts an durch Klicken auf das Button. Java Basics - Anfänger-Themen 20
D Array reverse Problem, da Referenz nicht auf tmpArray zeigt Java Basics - Anfänger-Themen 4
O graphics methode zeigt mein bild nicht an Java Basics - Anfänger-Themen 7
M Frame zeigt Desktop als Hintergrund Java Basics - Anfänger-Themen 2
J JDialog zeigt nichts an Java Basics - Anfänger-Themen 4
M SystemTray zeigt kein Icon an Java Basics - Anfänger-Themen 11
I JtextArea zeigt nichts an! Java Basics - Anfänger-Themen 3
K rattert, aber zeigt nichts an Java Basics - Anfänger-Themen 8
S Java zeigt immer nur das letzte Objekt der Liste Java Basics - Anfänger-Themen 4
P jar programm zeigt den text eingelesen aus datei nicht an Java Basics - Anfänger-Themen 3
G setborder zeigt das icon nicht an Java Basics - Anfänger-Themen 5
S JComboBox zeigt selektierten Wert nicht an. Java Basics - Anfänger-Themen 3
L Appletviewer zeigt nichts an Java Basics - Anfänger-Themen 2
C Kompilier zeigt Fehler an Java Basics - Anfänger-Themen 4
krgewb Keine richtige Doku Java Basics - Anfänger-Themen 5
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
Nooobi Regex und .matches() geben keine Ausnahme Java Basics - Anfänger-Themen 10
berserkerdq2 Warum ist das keine Referenzkopie mehr? Java Basics - Anfänger-Themen 26
O Java 17 keine Pflicht um Exceptiones zu behandeln? Java Basics - Anfänger-Themen 2
nbergmann Installation unter jdk.java.net: Keine ZIP-Datei zum entpacken Java Basics - Anfänger-Themen 2
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Keine Ausführung von System.out.println() Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
B Ich kann keine Hühner töten Java Basics - Anfänger-Themen 49
C Ganzzahlige Werte in Boolean ausgeben und überprüfen ob Primzahl oder nicht, wenn es keine Primzahl ist soll es die Primfaktorzerlegung ausgeben Java Basics - Anfänger-Themen 4
I Regex findet keine Treffer Java Basics - Anfänger-Themen 4
B Keine Ausgabe .. Woran liegt das? Ich komme nicht weiter Java Basics - Anfänger-Themen 14
T Bei mir wird keine javac angezeigt sondern nur javacpl Java Basics - Anfänger-Themen 2
R Keine Verbindung mit MariaDB Java Basics - Anfänger-Themen 18
O Input/Output newbile und keine Ahnung! Java Basics - Anfänger-Themen 16
S Kann keine Bilder laden? Java Basics - Anfänger-Themen 9
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
Bun17 Keine Ausgabe in der Konsole Java Basics - Anfänger-Themen 2
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
D jsoup.select findet keine elemente Java Basics - Anfänger-Themen 2
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
W Was bedeutet im Struktogramm „zufall“ aufrufen (keine Parameterübergabe)? Java Basics - Anfänger-Themen 8
T Keine Ahnung vom Programieren Java Basics - Anfänger-Themen 28
A SelectionSort bringt keine konstanten Ergebnisse Java Basics - Anfänger-Themen 4
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
C Keine javac.exe in bin-Datei Java Basics - Anfänger-Themen 3
A Vollkommene Zahlen: Findet keine Einzige Java Basics - Anfänger-Themen 9
J Input/Output javac HelloWorld.java - Keine Textausgabe in der Konsole Java Basics - Anfänger-Themen 4
H JDK installieren keine Installationsroutine bei Javainstallation sichtbar Java Basics - Anfänger-Themen 4
H Buttons zeigen keine Reaktion Java Basics - Anfänger-Themen 6
I Programm von mir - keine Ahnung mehr ob richtig falsch:-( Java Basics - Anfänger-Themen 6
D Datentypen Datentyperstellung | Kompiler sagt Syntax Error doch ich find keine Lösung Java Basics - Anfänger-Themen 2
Khorgoroth Erste Schritte Keine Ausgabe Java Basics - Anfänger-Themen 2
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
Z AWT package -> keine Konsole? Java Basics - Anfänger-Themen 2
Henri keine Ausgabe Java Basics - Anfänger-Themen 5
C Java stellt unter Windows keine Umlaute dar Java Basics - Anfänger-Themen 9
A Keine Konsolenausgabe Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben