Search code examples
javajsliderchangelistener

JSlider ChangeListener value to JTextArea


What do I need to change to make this code so that the JTextArea shows the final value of the JSlider? Currently it prints all the spots the slider has been to. I just want it to show in the JTextArea the final position of the slider rather than all the numbers it has been to.

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;


public class SliderDemo extends JPanel
                    implements 
                               WindowListener,
                               ChangeListener {
//Set up animation parameters.
static final int FPS_MIN = 0;
static final int FPS_MAX = 30;
static final int FPS_INIT = 15;    //initial frames per second


//This label uses ImageIcon to show the doggy pictures.


public SliderDemo() {
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));



    //Create the label.
    JLabel sliderLabel = new JLabel("Frames Per Second", JLabel.CENTER);
    sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);

    //Create the slider.
    JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL,
                                          FPS_MIN, FPS_MAX, FPS_INIT);


    framesPerSecond.addChangeListener(this);

    //Turn on labels at major tick marks.

    framesPerSecond.setMajorTickSpacing(10);
    framesPerSecond.setMinorTickSpacing(1);
    framesPerSecond.setPaintTicks(true);
    framesPerSecond.setPaintLabels(true);
    framesPerSecond.setBorder(
            BorderFactory.createEmptyBorder(0,0,10,0));
    Font font = new Font("Serif", Font.ITALIC, 15);
    framesPerSecond.setFont(font);

    add(sliderLabel);
    add(framesPerSecond);

    setBorder(BorderFactory.createEmptyBorder(10,10,10,10));}



/** Add a listener for window events. */
void addWindowListener(Window w) {
    w.addWindowListener(this);
}

//React to window events.


public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}

/** Listen to the slider. */
public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
        int fps = (int)source.getValue();


        String rick = Integer.toString(fps);

        JTextArea bob = new JTextArea();
        add(bob);

        bob.setText(rick);




        }
    }


private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("SliderDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    SliderDemo animator = new SliderDemo();

    //Add content to the window.
    frame.add(animator, BorderLayout.CENTER);

    //Display the window.
    frame.pack();
    frame.setVisible(true);

}

public static void main(String[] args) {
    /* Turn off metal's use of bold fonts */
    UIManager.put("swing.boldMetal", Boolean.FALSE);



    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

@Override
public void windowDeiconified(WindowEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void windowIconified(WindowEvent arg0) {
    // TODO Auto-generated method stub

}

}


Solution

  • Every time your state changes you are adding a new JTextArea:

    JTextArea bob = new JTextArea();
    add(bob);
    

    Instead, add a JTextArea only once in your SliderDemo constructor and simply use:

    bob.setText(...)
    

    in your ChangeListener.