Question

im trying to get the value of my jslider and input it so that it is the value for the boundary length and area of each shape that is creating from the if statement created in my first piece of code, then update my 2 jtextfields with the answer to boundary length and area, any tips on how to do this?

public class MyFrame extends javax.swing.JFrame {
    public MyFrame() {
        // Create the menu
        JMenuBar topMenu = new JMenuBar();
        this.setJMenuBar(topMenu);

        //create the menu button "shapes"
        JMenu shapes = new JMenu("Shapes");
        topMenu.add(shapes);
        //Create the 3 shapes for the menu
        JMenuItem square = new JMenuItem("Square");
        square.addActionListener(new ShapeAction());

        JMenuItem circle = new JMenuItem("Circle");      
        circle.addActionListener(new ShapeAction());

        JMenuItem triangle = new JMenuItem("Triangle");
        triangle.addActionListener(new ShapeAction());

        //add shapes to menu
        shapes.add(circle);
        shapes.add(triangle);
        shapes.add(square);

        //add the menu
        setJMenuBar(topMenu);


        MyControlPanel pane = new MyControlPanel();
        getContentPane().add(pane);

        this.add(pane);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        // <snip>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                new MyFrame().setVisible(true);
                }
                });
}
        class ShapeAction implements ActionListener{
            public void actionPerformed(ActionEvent e){
                JMenuItem clickedMenu = (JMenuItem)e.getSource();

                if (clickedMenu.getText().equals("Square")){
                    //implement abstract methods                
                    MyShape aSquare = new ASquare();

                }
                else if (clickedMenu.getText().equals("Circle")){ 
                    //implement abstract methods
                    MyShape ACircle = new ACircle();

                }
                else if (clickedMenu.getText().equals("Triangle")){ 
                    //implement abstract methods
                    MyShape ATriangle = new ATriangle();

                }
            }          
        }
    }

package assignment;

//import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class MyControlPanel extends javax.swing.JPanel {

JSlider slider;
JLabel sliderLabel;
JLabel sliderdimension;
JLabel blank;
JLabel dl;
JLabel area1;

/**
 * Creates new form MyControlPanel
 */
public MyControlPanel() {


    slider = new JSlider();
    slider.setValue(50);
    slider.addChangeListener(new MyChangeAction());
    slider.setMajorTickSpacing(10);
    slider.setPaintLabels(true);
    slider.setPaintTicks(true);
    slider.setBounds(300, 50, 100, 50);

    sliderLabel = new JLabel("50");
    blank = new JLabel("     ");
    sliderdimension = new JLabel("Shape Dimension:");

    JTextField boundary_length = new JTextField("Boundary Length");
    JTextField area = new JTextField("Area");

    dl = new JLabel("Boundary Length =");
    area1 = new JLabel("Area =");

    setLayout(new BorderLayout());


    JPanel sliderPanel = new JPanel();
    sliderPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));


    sliderPanel.add(sliderdimension);
    sliderPanel.add(sliderLabel);
    sliderPanel.add(slider);
    sliderPanel.add(dl);
    sliderPanel.add(boundary_length);
    sliderPanel.add(area1);
    sliderPanel.add(area);
    this.add(sliderPanel, BorderLayout.PAGE_END);



}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );
}// </editor-fold>                        
// Variables declaration - do not modify                     
// End of variables declaration                   

public class MyChangeAction implements ChangeListener {

    //complete code here
    public void stateChanged(ChangeEvent ce) {
        int value = slider.getValue();
        String str = Integer.toString(value);
        sliderLabel.setText(str);


    }
} // end class




    }

package assignment;

public abstract class MyShape
 {

double thelength;
double thearea;



public abstract double computeBoundaryLength(double Length);

public abstract double computeArea (double Length);
 }

package assignment;


public class ACircle extends MyShape {

@Override
public double computeBoundaryLength(double Length) 
{
    thelength=(2*Length*Math.PI);
return thelength;
}

@Override
public double computeArea(double Length) 
{
    thearea=(Length*Length*Math.PI);
    return thearea;
}

}
Was it helpful?

Solution

Make your textfields class variables and put these two lines in your stateChanged method:

boundary_length.setText(str);
area.setText(str);

Also make sure to create your textfields with a fixed number of columns so that they don't change length depending on the text they show.

UPDATE

I made some changes to your code in order to pass the value of the slider to your custom shapes:

  • MyControlPanel becomes an inner class of MyFrame
  • Textfields become class variables of MyControlPanel
  • The slider becomes class variable of MyFrame, so that its value can be accessed in ShapeAction.

Sample code:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MyFrame extends javax.swing.JFrame {

    JSlider slider;

    public MyFrame() {
        // Create the menu
        JMenuBar topMenu = new JMenuBar();
        this.setJMenuBar(topMenu);

        //create the menu button "shapes"
        JMenu shapes = new JMenu("Shapes");
        topMenu.add(shapes);
        //Create the 3 shapes for the menu
        JMenuItem square = new JMenuItem("Square");
        square.addActionListener(new ShapeAction());

        JMenuItem circle = new JMenuItem("Circle");      
        circle.addActionListener(new ShapeAction());

        JMenuItem triangle = new JMenuItem("Triangle");
        triangle.addActionListener(new ShapeAction());

        //add shapes to menu
        shapes.add(circle);
        shapes.add(triangle);
        shapes.add(square);

        //add the menu
        setJMenuBar(topMenu);


        MyControlPanel pane = new MyControlPanel();
        getContentPane().add(pane);

        this.add(pane);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        // <snip>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                new MyFrame().setVisible(true);
                }
                });
}
        class ShapeAction implements ActionListener{
            public void actionPerformed(ActionEvent e){
                JMenuItem clickedMenu = (JMenuItem)e.getSource();
                if (clickedMenu.getText().equals("Circle")){ 
                    int value = slider.getValue();
                    MyShape ACircle = new ACircle(value);
                }
            }          
        }

        public class MyControlPanel extends javax.swing.JPanel {

            JLabel sliderLabel;
            JLabel sliderdimension;
            JLabel blank;
            JLabel dl;
            JLabel area1;
            JTextField boundary_length = new JTextField("Boundary Length");
            JTextField area = new JTextField("Area");

            public MyControlPanel() {
                slider = new JSlider();
                slider.setValue(50);
                slider.addChangeListener(new MyChangeAction());
                slider.setMajorTickSpacing(10);
                slider.setPaintLabels(true);
                slider.setPaintTicks(true);
                slider.setBounds(300, 50, 100, 50);

                sliderLabel = new JLabel("50");
                blank = new JLabel("     ");
                sliderdimension = new JLabel("Shape Dimension:");

                dl = new JLabel("Boundary Length =");
                area1 = new JLabel("Area =");

                setLayout(new BorderLayout());

                JPanel sliderPanel = new JPanel();
                sliderPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));
                sliderPanel.add(sliderdimension);
                sliderPanel.add(sliderLabel);
                sliderPanel.add(slider);
                sliderPanel.add(dl);
                sliderPanel.add(boundary_length);
                sliderPanel.add(area1);
                sliderPanel.add(area);
                this.add(sliderPanel, BorderLayout.PAGE_END);
            }

            public class MyChangeAction implements ChangeListener {
                public void stateChanged(ChangeEvent ce) {
                    int value = slider.getValue();
                    String str = Integer.toString(value);
                    sliderLabel.setText(str);
                    boundary_length.setText(str);
                    area.setText(str);
                }
            }
        }
}

You should also add a constructor to your shape class (e.g. ACircle) that takes as input the value of the slider (use it as you want in your other methods)

public class ACircle extends MyShape {

    int value;

    public ACircle(int value) {
        this.value = value;
    }

    // other methods
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top