RnRoger
RnRoger

Reputation: 690

Program not overwriting variable

I have a program which uses 3 radiobuttons to switch between 3 incrementing values for a counter, here time. I want to change status when a radiobutton is pressed, and it does so, but only for a fraction. When launching the program will keep printing

0
Normal
2
Normal
4
Normal
6

etc. When I press the button slow it prints CHANGE Slow once but keeps incrementing with 2 and still prints Normal every time. How can I have this permenently switch to a different value for status, and a different increment, until I choose another radiobutton again?

package daynightcycle;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

/**
 * Day/night cycle with visuals. Adjustable speed and time inserts.
 * Optional date or daycounter later
 * @author rogie
 */
public class DayNightCycle extends JFrame implements Runnable{

    //JFrame entities
    private JPanel animationPanel;
    public JRadioButton button;
    public JRadioButton button2;
    public JRadioButton button3;
    public int time = 0;
    public String status = "Normal";


    public static void main(String[] args) {
        DayNightCycle frame = new DayNightCycle();
        frame.setSize(2000, 1300);
        frame.setLocation(1000,350);
        frame.createGUI();
        frame.setVisible(true);
        frame.setTitle("Day/Night Cycle, Rogier");
        (new Thread(new DayNightCycle())).start();
    }

   private void createGUI() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Container window = getContentPane();
    window.setLayout(new FlowLayout() );
    animationPanel = new JPanel();
    animationPanel.setPreferredSize(new Dimension(2000, 900));
    animationPanel.setBackground(Color.black);
    window.add(animationPanel);
    JRadioButton option1 = new JRadioButton("Slow");
    JRadioButton option2 = new JRadioButton("Normal", true);
    JRadioButton option3 = new JRadioButton("Fast");
    option1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
            System.out.println("CHANGE");
            status = "Slow";
            System.out.println(status);
        }
    });
    option2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            status = "Normal";
        }
    });
    option2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            status = "Fast";
        }
    });

    //option2.setFont(new java.awt.Font("Tahoma", Font.BOLD, 30)); 
    //option2.putClientProperty("JComponent.sizeVariant", "huge"); //doesn't work

    ButtonGroup group = new ButtonGroup();
    group.add(option1);
    group.add(option2);
    group.add(option3);
    add(option1);
    add(option2);
    add(option3);

        pack();
   }

    public void run() {

        while(true){
            System.out.println(time);
            System.out.println(status);
            try      
            {
                Thread.sleep(500);
                if (status.equals("Slow")) {
                    time += 1;
                } 
                else if (status.equals("Normal")){
                    time += 2;
                }
                else {
                    time += 3;
                }
            }   
                catch(InterruptedException ex) 
            {
                Thread.currentThread().interrupt();
            }

        }
    }
}

Upvotes: 0

Views: 64

Answers (2)

user8097737
user8097737

Reputation:

You are creating to DayNightCycle-Objects, the first shows the GUI and the second prints on the console.

Change the line

(new Thread(new DayNightCycle())).start();

to

(new Thread(frame)).start();

Upvotes: 2

Joop Eggen
Joop Eggen

Reputation: 109597

public static void main(String[] args) {
    final DayNightCycle frame = new DayNightCycle();
    frame.setSize(2000, 1300);
    frame.setLocation(1000,350);
    frame.createGUI();
    frame.setTitle("Day/Night Cycle, Rogier");

And then

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            frame.setVisible(true);
        }
    });

Or in java 8:

    EventQueue.invokeLater(() -> frame.setVisible(true));

}

You in effect created a second DayNightCycle.

Upvotes: 1

Related Questions