Timer - Swing

  • Themenstarter Themenstarter james234
  • Beginndatum Beginndatum
J

james234

Gast
Hallo!

Ich versuche gerade ein Programm zu schreiben, das jede 500ms die Farbe des Fensters wechselt.

Ich mache das mit einem Swing-Timer, dieser löste bei 500ms ein ActionEvent aus. Ich verstehe nicht, warum das nicht funktioniert was ich da fabriziert habe.

Ich meine wenn der rein geht in das Actionevent schaut er ob der Hintergrund rot oder grün ist, wenn er grün ist macht er auf rot und umgekehrt? Müsste doch eigentlich funktionieren?

Oder muss ich da was mit setDelay machen? Mit funktioniert es aber auch nicht. Bitte helft mir auf die Sprünge.

Danke!

mfg James

Hier der Code:
Java:
public class MainFrame extends JFrame {
  private JPanel contentPane;
 // private JButton button1;
 // private JButton button2;
  private Timer timer1;
//  private JPanel panel1;
  
  public MainFrame() {
    try {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      FrameInit();
    }
    catch (Exception exception) {
      exception.printStackTrace();
    }
  }

  /**
   * Component initialization.
   *
   * @throws java.lang.Exception
   */
  private void FrameInit() throws Exception {
    contentPane = (JPanel) getContentPane();
    contentPane.setLayout(new BorderLayout());
    setSize(new Dimension(400, 300));
    setTitle("Frame Title"); 
    
    //Timer(int delay, ActionListener listener);
    
    //timer1 = new Timer(500, timer1_ActionListener);
    
    contentPane.setBackground(Color.GREEN);
    
    timer1 = new Timer(500, new timer1_ActionListener());
    
    timer1.addActionListener(new timer1_ActionListener());
    

    timer1.start();
    
  
  }
  
  private class timer1_ActionListener implements ActionListener {
	  public void actionPerformed(ActionEvent ae) {
			
		 // System.out.println("asdf");
		
		  if(contentPane.getBackground() == Color.GREEN)
		  {
			  contentPane.setBackground(Color.RED);
                          timer1.setDelay(500);
		  }
		  else
		  {
			  contentPane.setBackground(Color.GREEN);
                          timer1.setDelay(500);
		  }
		  
		 
		} 
  }		
}
 
Du musst das Fenster auch neu Zeichnen lassen, wenn du den Background geändert hast.
Außerdem würde ich den Background nur mit einem Thread in der EventQueue ändern und neu zeichnen lassen,
Gruß
 
Lasse mal Zeile 37 weg (sonst wird der Listener zwei mal schnell hintereinander ausgeführt, daher siehst du keinen Wechsel). 53 und 58 können auch weg oder?!

@DerBo: repaint() sollte automatisch aufgerufen werden eig.! Ist also nicht nötig
 
Ok, stimmt danke euch 🙂!

Also die eigentliche Übung ist, dass ich eine so Art Reaktionstester machen soll. D.h. ich erstelle 2 Buttons, einen grünen und einen roten. Wenn der Hintergrund Rot ist und ich auf den roten drücken, dann soll eine variable inkrementiert werden, dasselbe dann mit Falsch gedrückt und mit nicht gedrückt.

Mein Problem ist aber wenn ich in einer Klasse raufzähle, kann ich dann in der anderen Klasse nicht auf diese Variable zugreifen.

Bitte gebt mir wieder paar Tipps dazu. Was könnte ich da andersmachen. Ja, ich hab mir das Java-Buch durchgelesen, aber irgendwie weis nicht, steh ich auf der Leitung und hab keine Ahnung wie ich mein Problem lösen kann.

Kann mir das einer erklären bitte?

Danke!

Hier der bis jetztige Code:
Java:
package Reaktionstester;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MainFrame extends JFrame {
  private JPanel contentPane;
  private JButton button_red;
  private JButton button_green;
  private Timer timer1;
  private JPanel panel1;
  private int zaehler_false = 0;
  private int zaehler_richtig = 0;
  private int zaehler_widh = 0;
  
  public MainFrame() {
    try {
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      FrameInit();
    }
    catch (Exception exception) {
      exception.printStackTrace();
    }
  }

  /**
   * Component initialization.
   *
   * @throws java.lang.Exception
   */
  private void FrameInit() throws Exception {
    contentPane = (JPanel) getContentPane();
    contentPane.setLayout(new BorderLayout());
    setSize(new Dimension(400, 300));
    setTitle("Frame Title"); 

    
    panel1 = new JPanel();
    panel1.setLayout(new FlowLayout());
    panel1.setBackground(Color.RED);
    
    button_red = new JButton("red");
    button_red.setBackground(Color.RED);
    button_red.addActionListener(new ButtonRed_ActionListener());
    button_green = new JButton("green");
    button_green.setBackground(Color.GREEN);
    button_green.addActionListener(new ButtonGreen_ActionListener());
    
    panel1.add(button_red, BorderLayout.CENTER);
    panel1.add(button_green, BorderLayout.CENTER);
  
    contentPane.add(panel1, BorderLayout.CENTER);
    
    timer1 = new Timer(500, new timer1_ActionListener());
   
    timer1.start();
    
   
  }
  
  private class ButtonRed_ActionListener implements ActionListener {
	 
	  public void actionPerformed(ActionEvent ae) {
	
		  if(panel1.getBackground() == Color.red)
		  {
			  zaehler_false++;
		  }
		  else
		  {
			  zaehler_richtig++;
		  }
		 
	  }
  }
  
  private class ButtonGreen_ActionListener implements ActionListener {
	  public void actionPerformed(ActionEvent ae) {
		  
		  if(panel1.getBackground() == Color.green)
		  {
			  zaehler_false++;
		  }
		  else
		  {
			  zaehler_richtig++;
		  }
		 
	  }
  }
  
  private class timer1_ActionListener implements ActionListener {
	  public void actionPerformed(ActionEvent ae) {
			
		
		  if(panel1.getBackground() == Color.GREEN)
		  {
			  panel1.setBackground(Color.RED);
		  }
		  else
		  {
			  panel1.setBackground(Color.GREEN);
		  }
		  zaehler_widh++;
		  
		  if(zaehler_widh == 20)
		  {
		    	timer1.stop();
		    	System.out.println("Falsch:" + zaehler_false);
		    	System.out.println("Richtig:" + zaehler_richtig);
		  }    
		 
		} 
  }		
}
 
Bitte, ich stehe an. Ich lese mir die doc durch etc., aber ich kappiers einfach nicht. Helft mir doch pls 🙂.
 

Neue Themen


Zurück
Oben