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

        /* Use two JSlider objects to control a related pair of
         * temperature and pressure values.
         * One slider controls the temperature and the other provides
         * a scaling factor with which to derive the pressure from
         * the temperature.
         * The units are arbitrary.
         */
class SwingSliderFrame extends JFrame {
    public SwingSliderFrame() {
        final int width = 360, height = 200;

        setSize(width,height);

        // Set up listeners for the two sliders.
        setupTemperatureSlider();
        setupPressureSlider();
        // Show the initial values.
        showTemperatureAndPressure();

        // A panel for the temperature and pressure displays.
        JPanel displayPanel = new JPanel();
        displayPanel.add(getTemperatureDisplay());
        displayPanel.add(getPressureDisplay());

        // Place the display and two JSliders vertically above
        // each other.
        JPanel groupedPanel = new JPanel();
        final int rows = 3, cols = 1;
        groupedPanel.setLayout(new GridLayout(rows,cols));
        groupedPanel.add(displayPanel);
        groupedPanel.add(getTemperatureSlider());
        groupedPanel.add(getScalingSlider());

        final Container contents = getContentPane();
        contents.add(groupedPanel,"Center");
        contents.add(new QuitJPanel(),"South");
    }

        // Attach a listener to the slider controlling the range of
        // possible temperatures.
    protected void setupTemperatureSlider(){
        getTemperatureSlider().addChangeListener(new ChangeListener(){
            public void stateChanged(ChangeEvent e){
                JSlider slider = (JSlider) e.getSource();
                // Only update when movement has settled down.
                if(!slider.getValueIsAdjusting()){
                    showTemperatureAndPressure();
                }
            }
        });
    }

        // Attach a listener to the slider controlling the scaling of
        // the temperature to produce a pressure.
    protected void setupPressureSlider(){
        // Add a listener to change the displays.
        getScalingSlider().addChangeListener(new ChangeListener(){
            public void stateChanged(ChangeEvent e){
                // Update continuously.
                showTemperatureAndPressure();
            }
        });
    }

        // Determine the new values from the two sliders and
        // display them.
    protected void showTemperatureAndPressure(){
        final JSlider tempSlider = getTemperatureSlider();
        final int temperature = tempSlider.getValue();
        final int pressure = temperature*getScalingSlider().getValue();

        getTemperatureDisplay().setText("T = "+temperature);
        getPressureDisplay().setText("P = "+pressure);
    }

    protected JLabel getTemperatureDisplay(){
        return temperatureDisplay;
    }

    protected JLabel getPressureDisplay(){
        return pressureDisplay;
    }

    protected JSlider getTemperatureSlider(){
        return temperatureSlider;
    }

    protected JSlider getScalingSlider(){
        return scalingSlider;
    }

    // Two labels to hold the dependent values.
    private final JLabel temperatureDisplay = new JLabel("T = 12345"),
                         pressureDisplay = new JLabel("P = 12345");
    {
        final Font f = new Font("SansSerif",Font.BOLD,16);
        temperatureDisplay.setFont(f);
        temperatureDisplay.setBorder(
                BorderFactory.createBevelBorder(BevelBorder.RAISED));
        pressureDisplay.setFont(f);
        pressureDisplay.setBorder(
                BorderFactory.createBevelBorder(BevelBorder.RAISED));
    }

        // A slider for controlling the temperature value.
    private final int minTemperature = 200, maxTemperature = 300,
                      initialTemperature = 273;
    private final JSlider temperatureSlider = new JSlider(JSlider.HORIZONTAL,
                minTemperature,maxTemperature,initialTemperature);
    {
        // Display major and minor ticks on the scale.
        temperatureSlider.setPaintTicks(true);
        temperatureSlider.setMajorTickSpacing(25);
        temperatureSlider.setMinorTickSpacing(5);
        temperatureSlider.setPaintLabels(true);
    }

        // A slider for the scaling the pressure. The current pressure
        // will be the current temperature scaled by this value.
        // Use the JSlider defaults for the scaling range.
    private final JSlider scalingSlider = new JSlider();
    {
        scalingSlider.setPaintTicks(true);
        scalingSlider.setMajorTickSpacing(10);
        scalingSlider.setPaintLabels(true);
    }
}
