Permalänk
Medlem

Swing Timer handledning (Java)

Hej

Jag skulle behöva lite handledning i ett "ReaktionsSpel" som jag håller på med till en uppgift i skolan.

Swing Timern som jag använder mig utav ska göra så att panelen blir GRÖN efter ett random antal sekunder som jag har definerat som "delay". Detta givetvist efter att jag har tryckt på start knappen.

Problemet är dock att panelen blir grön direkt efter att man har tryckt på knappen, den väntar inte med delayen helt enkelt.

Vad kan problemet vara? Här är koden

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class ReaktionSpel extends JFrame implements ActionListener{ private Timer timer; private JButton mainButton = new JButton("Start!"); private JPanel panel = new JPanel(); private int delay; private Random random; public ReaktionSpel(){ super("Reaktion Spel"); panel.setLayout(new FlowLayout()); getContentPane().add(panel); panel.setBackground(Color.yellow); panel.add(mainButton); mainButton.addActionListener(this); Random random = new Random(); int randomNumber = random.nextInt(5000)+1000; delay = randomNumber; System.out.print(delay); } public void actionPerformed(ActionEvent evt){ Object source = evt.getSource(); timer = new Timer(delay, this);{ panel.setBackground(Color.green); } if (source == source) timer.start(); else if (source != source) System.out.print("funkar inte"); } public static void main(String[] args) throws Exception{ ReaktionSpel panel = new ReaktionSpel(); panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setSize(200, 100); panel.setVisible(true); } }

MVH
Karim

Permalänk
Medlem

Re: Swing Timer handledning (Java)

Tjena,

att skapa timerobjektet inne i actionperformed är nog inte korrekt. Fick det att fungera på följande vis (sry för ev. fulkodande!):

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class ReaktionSpel extends JFrame implements ActionListener{ private Timer timer; private JButton mainButton = new JButton("Start!"); private JPanel panel = new JPanel(); private int delay; private Random random; public ReaktionSpel(){ super("Reaktion Spel"); panel.setLayout(new FlowLayout()); getContentPane().add(panel); panel.setBackground(Color.yellow); panel.add(mainButton); mainButton.addActionListener(this); Random random = new Random(); int randomNumber = random.nextInt(5000)+1000; delay = randomNumber; timer = new Timer(delay, this); System.out.print(delay); } public void actionPerformed(ActionEvent evt){ Object source = evt.getSource(); if (timer.equals(source)) { System.out.print("Grönt ljus!"); panel.setBackground(Color.green); timer.stop(); } else if (mainButton.equals(source)) { timer.start(); System.out.print("Knapp tryckt!"); } } public static void main(String[] args) throws Exception{ ReaktionSpel panel = new ReaktionSpel(); panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setSize(200, 100); panel.setVisible(true); } }

Lycka till!

Permalänk
Medlem

Re: Re: Swing Timer handledning (Java)

Citat:

Ursprungligen inskrivet av SWiFT.87
Tjena,

att skapa timerobjektet inne i actionperformed är nog inte korrekt. Fick det att fungera på följande vis (sry för ev. fulkodande!):

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class ReaktionSpel extends JFrame implements ActionListener{ private Timer timer; private JButton mainButton = new JButton("Start!"); private JPanel panel = new JPanel(); private int delay; private Random random; public ReaktionSpel(){ super("Reaktion Spel"); panel.setLayout(new FlowLayout()); getContentPane().add(panel); panel.setBackground(Color.yellow); panel.add(mainButton); mainButton.addActionListener(this); Random random = new Random(); int randomNumber = random.nextInt(5000)+1000; delay = randomNumber; timer = new Timer(delay, this); System.out.print(delay); } public void actionPerformed(ActionEvent evt){ Object source = evt.getSource(); if (timer.equals(source)) { System.out.print("Grönt ljus!"); panel.setBackground(Color.green); timer.stop(); } else if (mainButton.equals(source)) { timer.start(); System.out.print("Knapp tryckt!"); } } public static void main(String[] args) throws Exception{ ReaktionSpel panel = new ReaktionSpel(); panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setSize(200, 100); panel.setVisible(true); } }

Lycka till!

Tackar! Då förstår jag

Permalänk
Medlem

Re: Re: Re: Swing Timer handledning (Java)

Citat:

Ursprungligen inskrivet av Karim
Tackar! Då förstår jag

Jag såg en annan sak. Titta på din action performed:

public void actionPerformed(ActionEvent evt){ Object source = evt.getSource(); timer = new Timer(delay, this);{ panel.setBackground(Color.green); } // osv..

Det är ett semikolon efter timer = new Timer(delay,this); vilket resulterar i att innehållet i måsvingarna körs direkt. Med andra ord, panelen blir grön omgående. Jag antar att du vill köra färgändringen som en anonym metod? Då blir anropet timer = new Timer(delay, new ActionListener() { public void actionPerformed(ActionEvent e) { panel.setBackground(Color.green);} });

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Re: Swing Timer handledning (Java)

Citat:

Ursprungligen inskrivet av Karim
Hej

Jag skulle behöva lite handledning i ett "ReaktionsSpel" som jag håller på med till en uppgift i skolan.

Swing Timern som jag använder mig utav ska göra så att panelen blir GRÖN efter ett random antal sekunder som jag har definerat som "delay". Detta givetvist efter att jag har tryckt på start knappen.

Problemet är dock att panelen blir grön direkt efter att man har tryckt på knappen, den väntar inte med delayen helt enkelt.

Vad kan problemet vara? Här är koden

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class ReaktionSpel extends JFrame implements ActionListener{ private Timer timer; private JButton mainButton = new JButton("Start!"); private JPanel panel = new JPanel(); private int delay; private Random random; public ReaktionSpel(){ super("Reaktion Spel"); panel.setLayout(new FlowLayout()); getContentPane().add(panel); panel.setBackground(Color.yellow); panel.add(mainButton); mainButton.addActionListener(this); Random random = new Random(); int randomNumber = random.nextInt(5000)+1000; delay = randomNumber; System.out.print(delay); } public void actionPerformed(ActionEvent evt){ Object source = evt.getSource(); timer = new Timer(delay, new ActionListner() { public void actionPerformed(ActionEvent ev) { //Gör saken grön // då denna timer kommer aktiveras vid x //timer.stop() kanske?? annars kommer den alltid // vara grön } } //Pointless peice of code! // if (source == source) // timer.start(); // else if (source != source) // System.out.print("funkar inte"); } public static void main(String[] args) throws Exception{ ReaktionSpel panel = new ReaktionSpel(); panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setSize(200, 100); panel.setVisible(true); } }

MVH
Karim

Hur pointless är inte den kursiverade kontrollen?

Om source pekar på samma object som source:
- händer alltid
Annars
- händer aldrig

EDIT: Fixade i din kod, nu kanske det funkar om du fixar funtionalitet..

EDIT2: Var visst fixat..