SRG3006
SRG3006

Reputation: 457

Java resize shape with slider

Here's the code:

Main.java:

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

/**
 * Winter Assignment for Java 2012/13
 */

// Class definition

public class Main extends JPanel implements ActionListener {

    private JSlider sizeslider;
    private int startX, startY, endX, endY, val;
    private Color shapeColor = Color.black;
    private JComboBox shapeChoice, colorChoice;
    private Point firstPoint;
    private Circle firstCircle;
    private Square firstSquare;
    private Doughnut firstDoughnut;
    private Triangle firstTriangle;
    private Pentagon firstPentagon;
    private Point aShape;
    static final int SlideMin = 10;
    static final int SlideMax = 110;
    static final int SlideInit = 50;

    // Constructor method declaration

    public Main() {

        //Create the slider.
        sizeslider = new JSlider(JSlider.HORIZONTAL, SlideMin, SlideMax, SlideInit);
        add(sizeslider, BorderLayout.NORTH);

        shapeChoice = new JComboBox();
        shapeChoice.addItem("Point");
        shapeChoice.addItem("Square");
        shapeChoice.addItem("Circle");
        shapeChoice.addItem("Doughnut");
        shapeChoice.addItem("Triangle");
        shapeChoice.addItem("Pentagon");
        add(shapeChoice);
        shapeChoice.addActionListener(this);

        colorChoice = new JComboBox();
        colorChoice.addItem("Black");
        colorChoice.addItem("Red");
        colorChoice.addItem("Green");
        colorChoice.addItem("Blue");
        colorChoice.addItem("Yellow");
        colorChoice.addItem("Purple");
        colorChoice.addItem("Turquoise");
        add(colorChoice);
        colorChoice.addActionListener(this);


    this.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent me) {
        repaint();
    }

    public void mouseDragged(MouseEvent me) {
        aShape.moveXY(me.getX(), me.getY());
        repaint();
    }
});

    this.addMouseMotionListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent me) {
        repaint();
    }

    public void mouseDragged(MouseEvent me) {
        aShape.moveXY(me.getX(), me.getY());
        repaint();
    }
});

    sizeslider.addChangeListener(new ChangeListener() {
  public void stateChanged(ChangeEvent e) {
     JSlider source = (JSlider)e.getSource();  // get the slider
     if (!source.getValueIsAdjusting()) {
         val = source.getValue();  // get slider value
         aShape.reSize(val);
         repaint();
  }
}
});



        // Instantiate shape classes
        firstPoint = new Point();
        firstCircle = new Circle();
        firstSquare = new Square();
        firstDoughnut = new Doughnut();
        firstTriangle = new Triangle();
        firstPentagon = new Pentagon();


        // Initially assign aShape a Point object
        aShape = firstPoint;

        // Create a new window using the Swing class JFrame and add this panel
        makeFrame();
    }

    public void actionPerformed(ActionEvent e) {
        // Manipulate respective object when buttons pressed

       // checkbox assigns object to aShape
        if (e.getSource() == shapeChoice) {
            if (shapeChoice.getSelectedItem().equals("Circle"))
                aShape = firstCircle;
            else if (shapeChoice.getSelectedItem().equals("Square"))
                aShape = firstSquare;
            else if (shapeChoice.getSelectedItem().equals("Point"))
                aShape = firstPoint;
            else if (shapeChoice.getSelectedItem().equals("Doughnut"))
                aShape = firstDoughnut;
            else if (shapeChoice.getSelectedItem().equals("Triangle"))
                aShape = firstTriangle;
            else if (shapeChoice.getSelectedItem().equals("Pentagon"))
                aShape = firstPentagon;
        }


        // Assigns color to shape
        else if (e.getSource() == colorChoice) {
            if (colorChoice.getSelectedItem().equals("Black")) {
                shapeColor = Color.black;
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Red")) {
                shapeColor = Color.red;
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Green")) {
                shapeColor = Color.green;
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Blue")) {
                shapeColor = Color.blue;
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Yellow")) {
                shapeColor = Color.yellow;
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Purple")) {
                shapeColor = Color.decode("#9B30FF"); //Assignment said purple, but purple isn't defined in the Java api, so I used the hex code. The closest color in the API is Magenta.
                repaint();
            }
            else if (colorChoice.getSelectedItem().equals("Turquoise")) {
                shapeColor = Color.decode("#40E0D0"); //Turquoise hex code
                repaint();
            }
        }

        // Ask Java to repaint the window to reflect the updates made
        repaint();
    }

    // Provide this method to instruct Java what to do when repainting the window
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        g.setColor(shapeColor);

        // Call the respective methods from respective class to print the new co-ordinate values
        aShape.outputXYCoords(g);

        // Call the respective methods from respective class to redraw the shape
        aShape.display(g);
    }


    // Create a window frame

    public void makeFrame() {

        // Instantiate a window frame using Swing class JFrame
        JFrame frame = new JFrame("Winter Assignment");

        // When the window is closed terminate the application
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        // set initial size of window
        frame.setSize(800, 600);

        // add the current object to the centre of the frame and make visible
        frame.getContentPane().add(this, BorderLayout.CENTER);
        frame.setVisible(true);
    }   
}

Triangle.java

One of the shape files, they all have the same structure:

Triangle.java

import java.awt.*;

public class Triangle extends Point {
    protected int size;
    private int p1x, p2x, p3x, p1y, p2y, p3y;

    //Create a new triangle
    public Triangle()
    {
        super();
        size = 50;
        yPos = 100;
    }


    public void reSize(int newSize) {
        size = size + newSize;
    }

    //Draw the triangle with current specifications on screen.
    public void display(Graphics g) {
        p1x = xPos;
        p2x = xPos + size/2;
        p3x = xPos + size;
        p1y = yPos + size;
        p2y = yPos;
        p3y = yPos + size;
        int[] xPoints = { p1x, p2x, p3x };
        int[] yPoints = { p1y, p2y, p3y };
        int npoints = 3;
        g.fillPolygon(xPoints, yPoints, npoints);
    } 
}

I'm not sure how to resolve it. Also there is some junk code in there, but I just use it to reference what happens.

Upvotes: 1

Views: 6307

Answers (1)

David Kroukamp
David Kroukamp

Reputation: 36423

What I was hoping would happen: The slider would resize the shape to the value it's put on.

Here is a short example I made which will increase/decrease the width and height of the square to the amount on the slider i.e at 50 the squares width and height is 50 and at 60 they're 60 and so on.

This is done via getters and setters which allow access to the instances fields, We than add a ChangeListener to the JSlider to detect changes of value, and in there we set the vlaues of the instance using our setters and call repaint() which calls paintComponent of JPanel which will call draw(Graphcis2D g2d) of the shape to reflect the changes on the container:

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ShapeAndSliderTest {

    public ShapeAndSliderTest() {
        createAndShowGui();
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final MyRectangle myRectangle = new MyRectangle(10, 10, 50,50, Color.RED);

        JSlider jslider = new JSlider();
        jslider.setValue(50);
        jslider.setMaximum(250);
        jslider.setMinorTickSpacing(5);
        jslider.setMajorTickSpacing(10);
        jslider.setPaintTicks(true);
        jslider.setPaintLabels(true);

        // We'll just use the standard numeric labels for now...
        jslider.setLabelTable(jslider.createStandardLabels(50));

        final JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);

                Graphics2D g2d = (Graphics2D) grphcs;
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

                myRectangle.draw(g2d);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        jslider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent ce) {
                JSlider slider = (JSlider) ce.getSource();

                if (!slider.getValueIsAdjusting()) {
                    int newW = slider.getValue();
                    int newH = slider.getValue();

                    myRectangle.setWidth(newW);
                    myRectangle.setHeight(newH);

                    System.out.println(newW + "," + newH);

                    panel.repaint();
                }
            }
        });

        frame.add(jslider, BorderLayout.SOUTH);
        frame.add(panel, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ShapeAndSliderTest();
            }
        });
    }
}

class MyRectangle {

    private int x, y, width, height;
    private final Color color;

    public MyRectangle(int x, int y, int w, int h, Color color) {
        this.x = x;
        this.y = y;
        this.width = w;
        this.height = h;
        this.color = color;
    }

    void draw(Graphics2D g2d) {
        Color prevState = g2d.getColor();

        g2d.setColor(color);

        g2d.drawRect(x, y, width, height);

        g2d.setColor(prevState);

    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setWidth(int w) {
        this.width = w;
    }

    public void setHeight(int h) {
        this.height = h;
    }

    public int getHeight() {
        return height;
    }

    public int getWidth() {
        return width;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

Upvotes: 5

Related Questions