ActionListener bei Buttons

Java xyrse123

Bekanntes Mitglied
Hallo,
ich wollte eine kleine grafische Oberfläche machen wo ein Countdown abläuft, das ganze funktioniert auch. Nur wollte ich noch 2 Buttons einbauen mit denen man das ganze starten und stoppen kann, doch irgendwas funktioniert mit dem ActionListener und den Buttonereignissen nicht. Hier mein Code:

Code:
public class Countdown extends JFrame implements Runnable {
    int c = 10;
    private JButton b1;
    private JButton b2;

    public Countdown() {
        setSize(300, 300);
        setTitle("Countdown");
        add(new MyPanel());
        setVisible(true);

        // startAnimation();
    }

    class MyPanel extends JPanel implements ActionListener {

        MyPanel() {
            setBackground(Color.lightGray);
            setLayout(null);

            JButton b1 = new JButton("Start");
            b1.setBounds(50, 0, 75, 20);
            b1.setBackground(Color.GREEN);
            b1.addActionListener(this);
            b1.setFocusable(true);
            add(b1);
           
            JButton b2 = new JButton("Stop");
            b2.setBounds(150, 0, 75, 20);
            b2.setBackground(Color.RED);
            add(b2);

        }

        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.BLACK);
            g.setFont(new Font("Arial", Font.BOLD, 50));

            g.drawString("" + c, 120, 150);
            --c;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == b1) {
                System.out.println("Test");
                startAnimation();
            }          
        }
    }

    public void run() {
        while (c >= 0) {
            repaint();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }

        }

    }

    public void startAnimation() {
        Thread t = new Thread(this);
        t.start();
    }
    public static void main(String[] args) {
        new Countdown();
    }

}
 

Robat

Top Contributor
MyPanel() {
....
JButton b1 = new JButton("Start");
....
}
und
private JButton b1;
...
if (e.getSource() == b1)
sind 2 komplett verschiedene Objekte.

Im Konstruktor erstellst du noch mal eine lokale b1 Variable, welche nichts mit deinem globalen Objekt zu tun hat.
Im ActionListener prüfst du aber ob der gedrückte Button gleich deinem globalen Button ist - was nicht zutrifft.
Anstatt im Konstruktor eine lokale Variable zu erstellen solltest du deine globale Variable initialisieren.
 

Java xyrse123

Bekanntes Mitglied
Danke jetzt funktioniert es.
Doch ein Problem gibt es noch.
Wie kann ich den Thread unterbrechen, wenn ich auf "stop" drücke und das er dann erst wieder startet wenn ich auf "start" drücke.
 

Robat

Top Contributor
So wie ich dein Vorhaben verstehe kannst du es leider nicht umsetzen.
Threads können nicht gestoppt und dann wieder neu gestartet werden.
Was du machen musst ist jedes mal einen neuen Thread zu erstellen und den zu starten. (Hierfür lagerst du deine Logik am Besten in ein Runnable Objekt aus welches du den neuen Threads übergeben kannst).
 

Robat

Top Contributor
Vergiss was ich gesagt habe - hatte mir dein Code nicht noch mal angeschaut.
---
An sich passt dein Konstrukt ja schon.
Jedes mal wenn der User auf start drückt (und aktuell der Counter nicht läuft) soll ein neuer Thread gestartet werden.
Wenn der User auf stoppt drückt soll der aktuelle Thread gestoppt werden. Dazu müsstest du den Thread den du startest noch als globale Variable halten damit du ihn von überall stoppen kannst.
 

Java xyrse123

Bekanntes Mitglied
Gibt es noch eine andere Möglichkeit den Thread zu unterbrechen, den so bekomme ich eine Nullpointer Eception.
Code:
if (e.getSource() == b2) {    
    t.interrupt();        
   }
 

Robat

Top Contributor
Die NPE bekommst du sicherlich weil du ca so ein Konstrukt hast:
Java:
private Thread t;

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == b2) {
         t.interrupt();
    }
}

public void startAnimation() {
     Thread t = new Thread(this);
     t.start();
}
Oder? Wenn ja dann ist es der gleiche Fehler wie bei deiner Ausgangsfrage ;)
 

Java xyrse123

Bekanntes Mitglied
Ich wollte nur noch fragen ob ich das ganze auch noch anders lösen kann als mit dem flag.
Hier der Code:
Code:
  @Override
  public void actionPerformed(ActionEvent e) {
   Graphics g=getGraphics();
   if (e.getSource() == b1) {
    System.out.println("Test");
    startAnimation();
       flag=true;
   }
   if (e.getSource() == b2) {
    System.out.println("Test");
    t.interrupt();
    flag=false;    
    
   }
   if(e.getSource()==b3) {  // Reset Button
    t.interrupt();
    flag=false;
    c=10;
    g.setFont(new Font("Arial", Font.BOLD, 50));
    g.drawString("" + c, 120, 150);
   repaint();
   }
   
  }
 }
 public void run() {
  while(c>=0 && flag==true) { 
   repaint();
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
  }
 }
 

Java xyrse123

Bekanntes Mitglied
Wenn ich das Fenster in Hintergrund schiebe und dann wieder õffne oder wenn ich es vergrössere dann wird der Zähler einen runter gesetzt. Kann mir wer erklären woran das liegt?
 

Harry Kane

Top Contributor
Wenn ich das Fenster in Hintergrund schiebe und dann wieder õffne oder wenn ich es vergrössere dann wird der Zähler einen runter gesetzt. Kann mir wer erklären woran das liegt?
Wenn du das Fenster in den Fordergrund holst, muss es neu gezeichnet werden. Dazu wird paint aufgerufen, und darin wird der Zähler hochgesetzt.
Ein paar grundsätzliche Sachen:
1. In der paint (besser: paintComponent) Methode sollte nur gezeichnet werden!
2. Es sollte nur in der paintComponent-Methode gezeichnet werden! In deiner actionPerformed holst du dir einen Graphics und zeichnest da drauf. Das mag ja in den meisten Fällen so aussehen, als würde es funktionieren, aber irgendwann fällst du damit auf die Nase.
3. Bei Animationen mit Swing würde ich dringend dazu raten, das ganze mit einer Instanz von java.util.Timer zu machen. Hier ein Beispiel:
Java:
package swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class AnimatedTextPanel extends JComponent{

    private String text;
   
    private int cursor;
   
    public static void main(String[] args){
        JFrame frame = new JFrame("Animated Text");
        AnimatedTextPanel panel = new AnimatedTextPanel("Hier_ist_der_Text");
        Timer timer = new Timer(50, new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                panel.updateText();
            }
        });
        JButton switcher = new JButton("Start");
        switcher.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae){
                if(timer.isRunning()){
                    timer.stop();
                    switcher.setText("Start");
                }
                else{
                    timer.start();
                    switcher.setText("Stop");
                }
            }
        });
        frame.add(panel);
        JPanel buttons = new JPanel();
        buttons.add(switcher);
        frame.add(buttons, BorderLayout.NORTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
   
    public AnimatedTextPanel(String text){
        this.text = text;
        cursor = 0;
    }
    public void updateText(){
        cursor++;
        if(cursor > text.length()) cursor = 0;
        repaint();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        Dimension dim = super.getSize();
        g2.setColor(Color.RED);
        g2.setFont(new Font("Arial",1, 24));
        String toShow = text.substring(0, cursor);
        FontMetrics fm = g2.getFontMetrics();
        Rectangle2D rect = fm.getStringBounds(toShow, g);
        g2.drawString(toShow, dim.width/2 - (int)(rect.getWidth()/2), dim.height/2 +  (int)(rect.getHeight()/2));
    }
   
}
 

Harry Kane

Top Contributor
Eine bessere API: Timer können ganz einfach gestartet und gestoppt werden. Ausserdem kann der delay einfach geändert werden.
Eine aus meiner Sicht passendere Herangehensweise: Threads sollen einen Job erledigen, und nicht die meiste Zeit einfach nur warten, um dann jemand anderem zu sagen, etwas zu tun.
Threadersparnis: AFAIK teilen sich mehrere Timer einen gemeinsame Thread, in dem sie ihren Countdown runterzählen und auf ihren nächsten Einsatz warten.
Schliesslich: javax.swing.Timer kommen nie mit dem EDT ins Gehege, und werden ihn nie blockieren. Thread.sleep() legt den aktuellen Thread schlafen, und wenn das der EDT ist, friert die gesamte GUI ein.
In deinem Fall sieht deine Herangehensweise ok aus, aber ich würde empfehlen, es von Anfang an richtig zu machen.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
import javax.swing.Timer;
javax.swing.Timer

welchen von beiden denn jetzt? ;P

javax.swing.Timer kommen nie mit dem EDT ins Gehege, und werden ihn nie blockieren.
Wobei man da bedenken muss, dass die ausgelöste Aktion schon im EDT-Thread läuft, mit allen Vor und Nachteilen, und diesen deshalb natürlich auch blockieren kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
J mehrere Action Buttons mit einer ActionListener Methode AWT, Swing, JavaFX & SWT 7
G suche Actionlistener der "Loslassen" eines Buttons AWT, Swing, JavaFX & SWT 5
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben