JButton - Wechsel der Textfarbe alle 500ms

Hans0815

Neues Mitglied
Hallo zusammen,

kurz zu mir: Ich bin neu hier im Forum, aber schon länger Besucher des Forums, um mir Hilfestellungen oder Fragen, die mir beim Progammieren aufkamen, zu suchen oder natürlich meinstens zu finden.

Letztens bin auf folgende Aufgabe gestoßen, die mir doch einige Schwierigkeiten bereitet:
Erstellen Sie ein Programm, das ein Fenster mit einem Button anzeigt (Stopped). Wird auf den Button geklickt, soll der Text in "Running" geändert werden. Außerdem soll die Textfarbe alle 500ms zwischen Schwarz und Rot wechseln. Bei einem weiteren Klick wird wieder der Text "Stopped" ohne Farbwechsel in schwarzer Farbe angezeigt.

Folgendes habe ich bereits programmiert, jedoch weiß ich leider nicht wie das mit dem Farbwechsel alle 500ms funktionieren soll.
Vielleicht könnt ihr mir da ein wenig weiterhelfen.

Java:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class StoppRunning {
    JButton a;

    public static void main(String[] aa) {
        StoppRunning sr = new StoppRunning();
    }

    public StoppRunning() {
        JFrame jf = new JFrame();
        a = new JButton("Stopped");
        a.setPreferredSize(new Dimension(200, 50));
        Font schrift = (a.getFont().deriveFont(Font.BOLD, 20));
        a.setFont(schrift);
        a.addActionListener(new MyAction());

        jf.add(a);
        jf.setSize(230, 90);
        jf.setVisible(true);
        jf.setLocationRelativeTo(null);
        jf.setResizable(false);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public class MyAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String text = (String) e.getActionCommand();
            if (text.equals("Stopped")) {
                a.setText("Running...");
                // a.setForeground(Color.RED);
            } else {
                a.setText("Stopped");
                // a.setForeground(Color.BLACK);
            }
        }
    }
}
 

Robat

Top Contributor
Um das "blinken" hinzubekommen, müsstest du dich mal mit Threads beschäftigen.
Damit du das Verhalten des Threads (Farbe wechseln) nicht immer neu implementieren musst, könntest du dessen Verhalten in ein Runnable auslagern.
Die Logik des Runnables würde in Worte gefasst irgendwie so aussehen:

Code:
WENN textfarbe GLEICH rot
     DANN textfarbe = schwarz;
SONST
     DANN textfarbe = rot;
sleep(500);

Den ActionListener für den Button müsstest du dann irgenwie so ergänzen:

Code:
WENN button.text GLEICH "Run"
     DANN 
             button.text = "Stop"
             starte neuen Thread
ELSE
     DANN
            beende alten thread
            button.text = "Run"
 

X5-599

Top Contributor
Im Grunde schon. Ich fände allerdings den "javax.swing.Timer" hier sinnvoll. Ist für Einsteiger recht leicht handlebar und (wenn ich nicht irre) führt die Arbeit direkt im EDT aus.
 

X5-599

Top Contributor
Wie gesagt, ich finde "javax.swing.Timer" hier sinnvoller, da man sich z.B. nicht extra darum kümmern muss, dass die Arbeit auf dem EDT verrichtet wird. Das müsste/sollte man, wenn man mit dem "java.util.Timer" arbeitet. Und der Swing Timer wirkt (meiner Meinung nach) deutlich einfacher auf Einsteiger, da er mit dem, vermutlich bekannten, ActionListener Interface arbeitet.

Ist natürlich nur meine Meinung; Mit dem Util Timer/TimerTask lässt sich die Aufgabe sicher auch lösen.
 
X

Xyz1

Gast
Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

/**
 * @author
 */
public class ButtonColor {

    public static void main(String[] args) {
        JFrame frame = new JFrame("MY TITLE");
        JButton button = new JButton("stopped");
        MThread thread = new MThread(button);
        thread.start();
        button.addActionListener((ActionEvent e) -> {
            thread.breakk();
        });
        frame.add(button);
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);

        /* this is for Debug
        for (int i = 0; i < 999; i++) {
            for (int j = 0; j < 997; j++) {
                thread.breakk();
            }
        }
        */
    }
}

class MThread extends Thread {

    private boolean b1 = true; // this could be volatile
    private boolean b2 = false; // this could be volatile
    private JButton button;

    MThread(JButton button) {
        this.button = button;
    }

    @Override
    public void run() {
        try {
            while (b1) {
                synchronized (this) {
                    if (b2) {
                        button.setBackground(Color.white);
                    }
                }
                Thread.sleep(500); // this could be 0
                synchronized (this) {
                    if (b2) {
                        button.setBackground(Color.red);
                    }
                }
                Thread.sleep(500); // this could be 0
            }
        } catch (InterruptedException e) {
        }
    }

    synchronized void breakk() {
        if (b2) {
            button.setBackground(null);
            button.setText("stopped");
            b2 = false;
        } else {
            button.setText("running");
            b2 = true;
        }
    }

    synchronized void stopp() {
        b1 = false;
    }
}

Ich würde mich über Verbesserungsvorschläge freuen.
 

Flown

Administrator
Mitarbeiter
Verbesserung:
Java:
import javax.swing.*;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;

public class Test {
  public static void main(String... args) {
    BlinkingUI.start();
  }
}

final class BlinkingUI {

  public static void start() {
    SwingUtilities.invokeLater(BlinkingUI::new);
  }

  private static final String STOPPED = "Stopped";
  private static final String RUNNING = "Running";

  private BlinkingUI() {
    JFrame frame = new JFrame("Blinking Button");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLocationByPlatform(true);

    JButton button = new JButton(STOPPED);
    button.addActionListener(new MyActionListener(button));

    frame.add(button);
    frame.pack();
    frame.setVisible(true);
  }

  class MyActionListener implements ActionListener {
    private final Color[] COLORS = {Color.RED, Color.BLACK};
    private final int DELAY = 500;
    private final JButton button;
    private final Timer timer;

    private int pos;

    public MyActionListener(JButton button) {
      this.button = Objects.requireNonNull(button);
      pos = 0;
      timer = new Timer(DELAY, e -> {
        button.setForeground(COLORS[pos++ % COLORS.length]);
      });
      timer.setRepeats(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      button.setForeground(Color.BLACK);
      if (timer.isRunning()) {
        button.setText(STOPPED);
        timer.stop();
      } else {
        button.setText(RUNNING);
        pos = 0;
        timer.start();
      }
    }
  }
}
 

X5-599

Top Contributor
Das wäre mein Vorschlag:

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class StopRunning
{
	private static final String RUNNING = "Running";
	private static final String STOPPED = "Stopped";
	
	private JButton button;
	private Timer changer;
	
	
	public StopRunning()
	{
		JFrame jf = new JFrame();
		button = new JButton(STOPPED);
		button.setPreferredSize(new Dimension(200, 50));
		button.setFont(button.getFont().deriveFont(Font.BOLD, 20));
		button.addActionListener(new MyAction());
		
		changer = new Timer(500, new ColorChanger());
		changer.setRepeats(true);
		
		jf.add(button);
		
		jf.setSize(230, 90);
		jf.setLocationRelativeTo(null);
		jf.setResizable(false);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}
	
	private class MyAction implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e)
		{
			String text = (String)e.getActionCommand();
			if(text.equals(STOPPED))
			{
				button.setText(RUNNING);
				changer.start();
			}
			else
			{
				button.setText(STOPPED);
				changer.stop();
			}
		}
	}
	
	private class ColorChanger implements ActionListener
	{
		private boolean toggle = true;
		
		@Override
		public void actionPerformed(ActionEvent e)
		{
			toggle = !toggle;
			
			if(toggle)
			{
				button.setForeground(Color.RED);
			}
			else
			{
				button.setForeground(Color.BLACK);
			}
			
			button.revalidate();
			button.repaint();
		}
	}
	
	
	public static void main(String[] args)
	{
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run()
			{
				new StopRunning();
			}
		});
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
J Jbutton blinkt Java Basics - Anfänger-Themen 5
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
E JButton und JTextField Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
P JButton -Arrays Java Basics - Anfänger-Themen 4
A JButton in anderer Klasse bearbeiten. Java Basics - Anfänger-Themen 2
L Erste Schritte JButton reagiert nicht Java Basics - Anfänger-Themen 5
S Bild über JButton legen Java Basics - Anfänger-Themen 3
V Einem JButton anweisungen geben Java Basics - Anfänger-Themen 4
D Methoden JButton und JLabel in einer Methode erstellen Java Basics - Anfänger-Themen 5
F Interface JButton von anderer Klasse hinzufügen Java Basics - Anfänger-Themen 2
J JButton macht was er will Java Basics - Anfänger-Themen 3
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
N JButton anpassen Java Basics - Anfänger-Themen 3
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
V JButton einer anderen Klasse übergeben? Java Basics - Anfänger-Themen 6
F JButton [] mit Werten hinterlegen Java Basics - Anfänger-Themen 10
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A weiter JButton Fehler Java Basics - Anfänger-Themen 3
W JTable mit einem JButton-Array füllen Java Basics - Anfänger-Themen 4
S JCombobox und JButton verknüpfen Java Basics - Anfänger-Themen 6
V wie kann ich eine Schleife pausieren, bis ein Jbutton gedrückt wird ? Java Basics - Anfänger-Themen 17
N Erste Schritte JButton reagiert nur einmal. Java Basics - Anfänger-Themen 12
S JButton Java Basics - Anfänger-Themen 2
A Farben wechseln mit JButton Java Basics - Anfänger-Themen 2
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
A Labels Inner JButton Event Erstellbar? Java Basics - Anfänger-Themen 3
K JButton alles zurücksetzen Java Basics - Anfänger-Themen 1
U JButton: Beschriftung ueber Variable zuweisen Java Basics - Anfänger-Themen 6
S JButton erscheint erst bei Mouseover Java Basics - Anfänger-Themen 10
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S JDK installieren JButton BorderPoints?! Java Basics - Anfänger-Themen 7
E Problem mit erben von JButton Java Basics - Anfänger-Themen 7
J Bei Hinzufügen von JButton Programm langsam Java Basics - Anfänger-Themen 3
J Verknüpfung von JButton to JTextField Java Basics - Anfänger-Themen 4
S Jbutton per Passworteingabe aktivieren Java Basics - Anfänger-Themen 2
G über JButton Action einen anderen Button verändern Java Basics - Anfänger-Themen 7
H JButton - Icon(.png) aus resources laden Java Basics - Anfänger-Themen 23
M Hintergrundbild für JButton Java Basics - Anfänger-Themen 6
A jbutton - icon linksbündig, text zentriert Java Basics - Anfänger-Themen 10
M Input/Output JFrame mit JButton und JTextfield Java Basics - Anfänger-Themen 114
J Hilfe bei JButton Java Basics - Anfänger-Themen 6
A JButton[] und String[] in doppelter For-Schleife Java Basics - Anfänger-Themen 4
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
pg1337 JButton zuschneiden Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
D JButton Array setBackground Java Basics - Anfänger-Themen 2
F JButton wie selektierter JTabbebPane-Header Java Basics - Anfänger-Themen 7
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
C OOP Java JButton mit Funktion belegen Java Basics - Anfänger-Themen 3
S JButton wird nicht angezeigt Java Basics - Anfänger-Themen 14
C JButton.getIcon() != null Java Basics - Anfänger-Themen 3
E JButton-Text wird in Schleife nicht geändert Java Basics - Anfänger-Themen 4
F welches Layout für JButton-Liste verwenden Java Basics - Anfänger-Themen 6
T JButton Text ändern Java Basics - Anfänger-Themen 4
L JButton erscheint nur mit pack() Java Basics - Anfänger-Themen 3
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
E JButton Hintergrund / Rahmen entfernen? Java Basics - Anfänger-Themen 4
L Bild auf einem JButton Java Basics - Anfänger-Themen 4
K JButton.setText Problem Java Basics - Anfänger-Themen 6
M JButton und DisabledIcon Java Basics - Anfänger-Themen 2
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
A GUI - JButton problem! Java Basics - Anfänger-Themen 5
M JButton selbst nachprogrammieren Java Basics - Anfänger-Themen 3
A JButton Textrahmen Java Basics - Anfänger-Themen 7
A Platzierung eines JButton Java Basics - Anfänger-Themen 4
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R Liste graphischer Objekte z.B. JButton dynamisch erstellen Java Basics - Anfänger-Themen 13
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
S JButton trotz Box-Layout skalieren Java Basics - Anfänger-Themen 6
P JButton identifizieren Java Basics - Anfänger-Themen 8
K Funktion zu einem JButton hinzufügen Java Basics - Anfänger-Themen 27
D HTML Text von jButton disablen Java Basics - Anfänger-Themen 2
E Auf JButton in Arraylist zugreifen Java Basics - Anfänger-Themen 6
E Andere Form eines JButton Java Basics - Anfänger-Themen 17
A JButton ActionListener nach einmaligem Ausführen zurücksetzen Java Basics - Anfänger-Themen 13
B JButton Größe einstellen? Java Basics - Anfänger-Themen 3
E Zeilenumbruch in JButton mit Variable Java Basics - Anfänger-Themen 2
A JButton erscheint nicht (BlueJ) Java Basics - Anfänger-Themen 2
M JButton sieht komisch aus :-) Java Basics - Anfänger-Themen 5
B JPanel über JButton umändern Java Basics - Anfänger-Themen 9
D JButton transparent bekommen? Java Basics - Anfänger-Themen 5
H JButton Unsichtbar Java Basics - Anfänger-Themen 7
R JTextField mittels JButton in Konsole ausgeben Java Basics - Anfänger-Themen 2
J Variable die bei JButton Clicks mitzählt Java Basics - Anfänger-Themen 9
Developer_X JButton removt sich selbst Java Basics - Anfänger-Themen 32

Ähnliche Java Themen

Neue Themen


Oben