0

Created a Program similar to paint where there is a rectangle whose movement inside the screen can be controlled by "w,a,s,d" keys and its size increased or decreased using the scroller on the mouse. There are also several buttons of various colours which when pressed fills the rectangular shape with the respective colours. I'm also trying to paint with this rectangle ie. when I press the space bar I want to fill the colour which is selected at the specified area. Now even though I can do that. The next action I do ie. either pressing "w,a,s,d" keys or the scroller, the colour disappears. Now I know that the colour or fillRect() has to be saved somehow so that the next action doesn't affect it, but I've tried several ways but it isn't happening. I've tried to use a loop to store the values of the rectangle so that each time it repaints it will repaint on all of the values contained inside the loop. But this isn't working. If its not working due to some miscalculation do say that, if not and this method of using loops is wrong please do suggest other simple methods to do this.

So Basically what I'm trying to do is when pressing the space bar I want an imprint of the rectangle of that colour and when I move the rectangle away. I want that imprint to stay there.

Note: I know my code is poor and not all viable but I'm doing this project with what we were taught and I hope you will provide the solution along the lines of this.

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

public class Animation extends Frame implements KeyListener, MouseWheelListener, ActionListener {


    int x,y,a,b;
    char choice1;
    int draw=1;
    int defaultValue=0;
    int n=0;
    int color1,color2,color3;
    Button button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,button11;

    Animation() {
        setSize(1000, 1000);
        setVisible(true);
        x = 500;
        y = 500;
        a = 20;
        b = 50;

        JPanel panel = new JPanel();
        button1 = new Button("Black");
        button2 = new Button("Blue");
        button3 = new Button("Green");
        button4 = new Button("Orange");
        button5 = new Button("Red");
        button6 = new Button("Yellow");
        button7 = new Button("Gray");
        button8 = new Button("Cyan");
        button9 = new Button("Magenta");
        button10 = new Button("Pink");
        button11 = new Button("Default");

        panel.add(button1);panel.add(button2);panel.add(button3);panel.add(button4);panel.add(button5);
        panel.add(button6);panel.add(button7);panel.add(button8);panel.add(button9);panel.add(button10);
        panel.add(button11);


        add(panel);

//        button1.setBounds(50,680,50,20); button2.setBounds(120,680,50,20);
//        button3.setBounds(190,680,50,20); button4.setBounds(260,680,50,20);
//        button5.setBounds(330,680,50,20); button6.setBounds(400,680,50,20);
//        button7.setBounds(470,680,50,20); button8.setBounds(540,680,50,20);
//        button9.setBounds(610,680,50,20); button10.setBounds(680,680,50,20);

        button1.setFocusable(false);
        button2.setFocusable(false);
        button3.setFocusable(false);
        button4.setFocusable(false);
        button5.setFocusable(false);
        button6.setFocusable(false);
        button7.setFocusable(false);
        button8.setFocusable(false);
        button9.setFocusable(false);
        button10.setFocusable(false);
        button11.setFocusable(false);

        button1.addActionListener(this);button2.addActionListener(this);
        button3.addActionListener(this);button4.addActionListener(this);
        button5.addActionListener(this);button6.addActionListener(this);
        button7.addActionListener(this);button8.addActionListener(this);
        button9.addActionListener(this);button10.addActionListener(this);
        button11.addActionListener(this);
        addKeyListener(this);
        addMouseWheelListener(this);
        addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }

            @Override
            public void windowIconified(WindowEvent e) {
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
            }

            @Override
            public void windowActivated(WindowEvent e) {
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
            }
        });
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyPressed(KeyEvent e) {
    }
    @Override
    public void keyReleased(KeyEvent e) {
        choice1 = e.getKeyChar();
        if (choice1 == 'w') {
            y = y - 10;
        }
        if (choice1 == 's') {
            y = y + 10;
        }
        if (choice1 == 'a') {
            x = x - 10;
        }
        if (choice1 == 'd') {
            x = x + 10;
        }
        if(choice1 == ' '){
            draw=2;
        }
        repaint();
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        double p = e.getPreciseWheelRotation();
        if(p>0){
            a=a+5;
            b=b+5;
        } else{
            a=a-5;
            b=b-5;
        }
        repaint();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        defaultValue = 0;
        if(e.getActionCommand().equals("Black")){
            color1 = 0;
            color2 = 0;
            color3 = 0;
        }
        if(e.getActionCommand().equals("Blue")){
            color1 = 0;
            color2 = 0;
            color3 = 255;
        }
        if(e.getActionCommand().equals("Green")){
            color1 = 0;
            color2 = 255;
            color3 = 0;
        }
        if(e.getActionCommand().equals("Orange")){
            color1 = 255;
            color2 = 165;
            color3 = 0;
        }
        if(e.getActionCommand().equals("Red")){
            color1 = 255;
            color2 = 0;
            color3 = 0;
        }
        if(e.getActionCommand().equals("Yellow")){
            color1 = 255;
            color2 = 255;
            color3 = 0;
        }
        if(e.getActionCommand().equals("Gray")){
            color1 = 169;
            color2 = 169;
            color3 = 169;
       }
        if(e.getActionCommand().equals("Cyan")){
            color1 = 0;
            color2 = 255;
            color3 = 255;
        }
        if(e.getActionCommand().equals("Magenta")){
            color1 = 255;
            color2 = 0;
            color3 = 255;
        }
        if(e.getActionCommand().equals("Pink")){
            color1 = 255;
            color2 = 192;
            color3 = 203;
        }
        if(e.getActionCommand().equals("Default")){
            defaultValue = 1;
        }
        repaint();

    }

    public void paint(Graphics g) {
        super.paint(g);
        if(draw==1) {

            if(defaultValue == 1){
                g.setColor(new Color(color1,color2,color3));
                g.drawRect(x, y, a, b);
            }else{
                g.drawRect(x, y, a, b);
                g.setColor(new Color(color1,color2,color3));
                g.fillRect(x,y,a,b);
            }


        }
        if(draw==2){
            g.setColor(new Color(color1,color2,color3));
            int[] temp1 = new int[50];
            temp1[n] = x;
            int[] temp2 = new int[50];
            temp2[n] = y;
            int[] temp3 = new int[50];
            temp3[n] = a;
            int[] temp4 = new int[50];
            temp4[n] = b;


            n++;
            for (int i=0;i<n;i++){
                g.drawRect(x, y, a, b);
                g.fillRect(temp1[i],temp2[i],temp3[i],temp4[i]);
            }
            draw=1;
        }
    }

    public static void main(String[] args) {
        Animation animation = new Animation();

    }

}
Gilbert Le Blanc
  • 50,182
  • 6
  • 67
  • 111
  • 1) Don't mix Swing and AWT components! Use `JButton` & `JFrame` 2) Don't do custom painting in a top level container like a window or frame, but a panel (`JPanel`) added to a top level container. 3) For better help sooner, [edit] to add a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). Shorten the code a variety of ways. Are the buttons relevant to the problem? Remove them to find out. They *are* relevant? Have only two. The close operation of a `JFrame` can be set in a single line of code. That removes the need for a `WindowListener`.. – Andrew Thompson Dec 06 '20 at 10:22
  • .. 4) `setVisible(true);` should be last 5) The low level `KeyListener` is fraught with problems. Swing offers key bindings which solve many of them. – Andrew Thompson Dec 06 '20 at 10:23
  • You should override paintComponent() rather than paint(). – NomadMaker Dec 06 '20 at 10:29
  • @AndrewThompson FYI, I gave the OP 10 suggestions on his last question: https://stackoverflow.com/a/65159474/131872. Not a single suggestion has been implemented in this code even something as simple as NOT extending Frame. – camickr Dec 06 '20 at 15:34
  • 2
    (1-) Most of the suggestions made by Andrew and Nomad were made by me in your last question. We only have limited time to answer questions. Their time could have been better spent by answering other question instead of repeating the same suggestions. Problem solving is easier when you have a good design. Making a suggestion based on your current design doesn't make sense since we know the design will change and the suggestion may no longer apply. The answer to this question is simple, but I for one will not be responding until previous issues have been resolved. – camickr Dec 06 '20 at 15:54

1 Answers1

2

I am not a Swing expert but attempted to fix your code and I think it works.

Made the following changes:

  1. a list to store all the imprinted images(by entering 'space bar'), which removes the integer arrays that you had in your code.

  2. Rectangle.java, the value object(added at the bottom of this code)

  3. Added mouselistener for the moue pressed action.

  4. Used Color constants instead of int values for the color components.

Basically, hitting the space bar will add the current Rectangle to the list which can later be repainted.


import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

public class Animation extends Frame implements KeyListener, MouseWheelListener,MouseListener, ActionListener {


    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    int x,y,a,b;
    char choice1;
    int defaultValue=0;
    int number=0;
    Color cursorColor = Color.BLACK;
    boolean isImprint = false;
    private Rectangle baseRect =  null;
    private List<Rectangle> lstImprints = new ArrayList<Rectangle>();
    Button button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,button11;
    

    Animation() {
        System.out.println("animation ");
        setSize(1000, 1000);
        setVisible(true);
        x = 500;
        y = 500;
        a = 20;
        b = 50;
        baseRect = new Rectangle(x, y, a, b, cursorColor);
        JPanel panel = new JPanel();
        button1 = new Button("Black");
        button2 = new Button("Blue");
        button3 = new Button("Green");
        button4 = new Button("Orange");
        button5 = new Button("Red");
        button6 = new Button("Yellow");
        button7 = new Button("Gray");
        button8 = new Button("Cyan");
        button9 = new Button("Magenta");
        button10 = new Button("Pink");
        button11 = new Button("Default");

        panel.add(button1);panel.add(button2);panel.add(button3);panel.add(button4);panel.add(button5);
        panel.add(button6);panel.add(button7);panel.add(button8);panel.add(button9);panel.add(button10);
        panel.add(button11);


        add(panel);

        //        button1.setBounds(50,680,50,20); button2.setBounds(120,680,50,20);
        //        button3.setBounds(190,680,50,20); button4.setBounds(260,680,50,20);
        //        button5.setBounds(330,680,50,20); button6.setBounds(400,680,50,20);
        //        button7.setBounds(470,680,50,20); button8.setBounds(540,680,50,20);
        //        button9.setBounds(610,680,50,20); button10.setBounds(680,680,50,20);

        button1.setFocusable(false);
        button2.setFocusable(false);
        button3.setFocusable(false);
        button4.setFocusable(false);
        button5.setFocusable(false);
        button6.setFocusable(false);
        button7.setFocusable(false);
        button8.setFocusable(false);
        button9.setFocusable(false);
        button10.setFocusable(false);
        button11.setFocusable(false);

        button1.addActionListener(this);button2.addActionListener(this);
        button3.addActionListener(this);button4.addActionListener(this);
        button5.addActionListener(this);button6.addActionListener(this);
        button7.addActionListener(this);button8.addActionListener(this);
        button9.addActionListener(this);button10.addActionListener(this);
        button11.addActionListener(this);
        this.addMouseListener(this);
        addKeyListener(this);
        addMouseWheelListener(this);
        addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }

            @Override
            public void windowIconified(WindowEvent e) {
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
            }

            @Override
            public void windowActivated(WindowEvent e) {
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
            }
        });
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyPressed(KeyEvent e) {
    }
    @Override
    public void keyReleased(KeyEvent e) {
        choice1 = e.getKeyChar();
        if (choice1 == 'w') {
            //y = y - 10;
            baseRect.setY(baseRect.getY()-10);
        }
        if (choice1 == 's') {
            //y = y + 10;
            baseRect.setY(baseRect.getY()+10);
        }
        if (choice1 == 'a') {
            //x = x - 10;
            baseRect.setX(baseRect.getX()-10);
        }
        if (choice1 == 'd') {
            //x = x + 10;
            baseRect.setX(baseRect.getX()-10);
        }
        if(choice1 == ' '){
            isImprint = true;
        }

        System.out.println("choice 1"+choice1);
        repaint();
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        double p = e.getPreciseWheelRotation();
        if(p>0){
            baseRect.setHeight(baseRect.getHeight()+5);
            //b=b+5;
            baseRect.setWidth(baseRect.getWidth()+5);
        } else{
            baseRect.setHeight(baseRect.getHeight()-5);
            baseRect.setWidth(baseRect.getWidth()-5);
            //b=b-5;
        }
        repaint();
    }
    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("action performed");
        defaultValue = 0;
        if(e.getActionCommand().equals("Black")){
            cursorColor = Color.BLACK;
        }
        if(e.getActionCommand().equals("Blue")){
            cursorColor = Color.BLUE;
        }
        if(e.getActionCommand().equals("Green")){
            cursorColor = Color.GREEN;
        }
        if(e.getActionCommand().equals("Orange")){
            cursorColor = Color.ORANGE;
        }
        if(e.getActionCommand().equals("Red")){
            cursorColor = Color.RED;
        }
        if(e.getActionCommand().equals("Yellow")){
            cursorColor = Color.YELLOW;
        }
        if(e.getActionCommand().equals("Gray")){
            cursorColor = Color.GRAY;
        }
        if(e.getActionCommand().equals("Cyan")){
            cursorColor = Color.CYAN;
        }
        if(e.getActionCommand().equals("Magenta")){
            cursorColor = Color.MAGENTA;
        }
        if(e.getActionCommand().equals("Pink")){
            cursorColor = Color.PINK;
        }
        if(e.getActionCommand().equals("Default")){
            defaultValue = 1;
        }
        repaint();

    }

    public void paint(Graphics g) {

        System.out.println("paint ");
        super.paint(g);
            
        g.setColor(cursorColor);
        g.drawRect(baseRect.getX(),baseRect.getY(),baseRect.getHeight(),baseRect.getWidth());
        g.fillRect(baseRect.getX(),baseRect.getY(),baseRect.getHeight(),baseRect.getWidth());
        
        System.out.println(lstImprints.size());
        for(Rectangle rect : lstImprints){
            g.setColor(rect.getColor());
            g.drawRect(rect.getX(),rect.getY(),rect.getHeight(),rect.getWidth());
            g.fillRect(rect.getX(),rect.getY(),rect.getHeight(),rect.getWidth());
        }
/*      if(defaultValue == 1){
            g.setColor(cursorColor);
            g.drawRect(rect.getX(),rect.getY(),rect.getHeight(),rect.getWidth());

        }else{
            g.drawRect(x, y, a, b);
            g.setColor(cursorColor);                
            g.fillRect(x,y,a,b);

        }*/
    }

    public static void main(String[] args) {
        Animation animation = new Animation();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        if(isImprint){
            Point point = e.getLocationOnScreen();
            Rectangle rectangle = new Rectangle(Double.valueOf(point.getX()).intValue(), Double.valueOf(point.getY()).intValue(), baseRect.getHeight(), baseRect.getWidth(),cursorColor);
            lstImprints.add(rectangle);
            isImprint = false;
            repaint();
        }

    }

}

import java.awt.Color;

public class Rectangle {
    
    private int x;
    
    private int y;
    
    private int height;
    
    private int width;
    
    private Color color = null;

    public Rectangle(int x, int y, int height, int width, Color color) {
        super();
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
        this.color = color;
    }

    public int getX() {
        return x;
    }

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

    public int getY() {
        return y;
    }

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

    public int getHeight() {
        return height;
    }

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

    public int getWidth() {
        return width;
    }

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

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }
}
Prabhu
  • 129
  • 1
  • 1
  • 9