CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 8 of 8
  1. #1
    Join Date
    Mar 2012
    Posts
    4

    Arrow Drawing Rectangles in Java

    Hello People

    I have my program the need to generate rectangles on the screen when i click on a JButton and then be able to drag them on the screen but I am having one problem:

    here is my code for that class:
    Code:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    public class GUI extends JFrame {
    	
    static BufferedImage img = imageloading.mImage;
    private static final int width = img.getWidth();
    private static final int height = img.getHeight();
    
    static int cellSize = 5;
    public static int cellInWidth = width/cellSize;
    public static int cellInHeight = height/cellSize;
    
    public static Cell[][] cells = new Cell[cellInWidth][cellInHeight];
    
    private JPanel mainPanel = new JPanel();
    private JScrollPane scrollBar=new JScrollPane(mainPanel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
    private GridPanel gridPanel = new GridPanel();
    private JPanel buttonPanel = new JPanel();
    private JButton startButton = new JButton("Start");
    private JButton edgeButton = new JButton("Detect Edge");
    private JButton woodButton = new JButton("Detect Wood");
    private JButton doorButton = new JButton("Find Door");
    private JButton rectButton = new JButton("Add Object");
    private JButton loadImage  = new JButton("Select Image");
    private JLabel label = new JLabel("Cell size:");
    private JComboBox comboBox = new JComboBox(new Integer[]{5, 10, 15, 20, 25, 30});
    
    File curFile;
    
    private Logic logic = new Logic(this);
    
    public static boolean runnedFirstTime = false;
    
    static {
    for (int i = 0; i < cellInWidth; i++) {
    for (int j = 0; j < cellInHeight; j++) {
    cells[i][j] = new Cell(i, j);
    }
    }
    }
    
    private MouseAdapter mousePressed = new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    mousePressedLogic(e);
    }
    };
    
    private MouseAdapter mouseMotion = new MouseAdapter() { 
    public void mouseDragged(MouseEvent e) {
    mousePressedWoodLogic(e);
    }
    };
    
    private void mousePressedLogic(MouseEvent e) {
    	if (logic.hasStarted()) return;
    
    	int x = e.getY();
    	int y = e.getX();
    
    	int gridsToTheLeft = y / cellSize;
    	int gridsFromTop = x / cellSize;
    
    	if (gridsToTheLeft >= cellInWidth || gridsFromTop >= cellInHeight)
    	return;
    
    	cells[gridsToTheLeft][gridsFromTop].setStatus(Cell.BURNING);
    
    	repaint();
    	}
    private void mousePressedWoodLogic(MouseEvent e) {
    	if (logic.hasStarted()) return;
    
    	int x = e.getY();
    	int y = e.getX();
    
    	int gridsToTheLeft = y / cellSize;
    	int gridsFromTop = x / cellSize;
    
    	if (gridsToTheLeft >= cellInWidth || gridsFromTop >= cellInHeight)
    	return;
    
    	cells[gridsToTheLeft][gridsFromTop].setStatus(Cell.DOOR);
    
    	repaint();
    }
    
    /**
    * Constructor
    */
    public GUI() {
    setTitle("Fire Spreading");
    setSize(1000, 700);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    
    mainPanel.setLayout(new BorderLayout());
    mainPanel.add(gridPanel, BorderLayout.CENTER);
    buttonPanel.add(startButton);
    buttonPanel.add(edgeButton);
    buttonPanel.add(woodButton);
    buttonPanel.add(doorButton);
    buttonPanel.add(rectButton);
    buttonPanel.add(loadImage);
    buttonPanel.add(label);
    buttonPanel.add(comboBox);
    mainPanel.add(buttonPanel, BorderLayout.SOUTH);
    //mainPanel.setBackground(Color.GREEN);
    
    
    comboBox.setSelectedItem(5);
    
    comboBox.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    cellSize = (Integer)comboBox.getSelectedItem();
    
    cellInWidth = width/cellSize; //number of cells in width
    cellInHeight = height/cellSize;
    
    cells = new Cell[cellInWidth][cellInHeight];
    
    for (int i = 0; i < cellInWidth; i++) {
    for (int j = 0; j < cellInHeight; j++) {
    cells[i][j] = new Cell(i, j);
    }
    }
    
    	for (int i = 0; i < cells.length; i++) {
    	for (int j = 0; j < cells[0].length; j++) {
    	cells[i][j].setStatus(Cell.DEFAULT);
    	} 
    	}
    logic.setCells(cells);
    logic.setStarted(false);
    
    if (logic.isTimerCreated())
    runnedFirstTime = true;
    
    repaint();
    }
    });
    
    rectButton.addMouseListener(new MouseAdapter() {
    	public void mouseClicked(MouseEvent e) {
    	
    		//add rectangle shape
    		addshape(new RectShape());
    		
    		logic.setStarted(false);
    		runnedFirstTime = false;
    		repaint();
    	}
    	});
    
    woodButton.addMouseListener(new MouseAdapter() {
    	public void mouseClicked(MouseEvent e) {
    		
    		for (int i = 0; i < cells.length; i++) {
    			for (int j = 0; j < cells[0].length; j++) {
    			int cellColor=0;
    			int cellColorG=0;
    			int cellColorB=0;
    
    			for (int ii = 0; ii < cellSize; ii++) {
    			for (int jj = 0; jj < cellSize; jj++) {
    
    			// calculate new pixel position
    			int pixelPositionX = i * cellSize + ii;
    			int pixelPositionY = j * cellSize + jj;
    			int pixel = img.getRGB(pixelPositionX, pixelPositionY);
    			Color color = new Color(pixel);
    
    			if (color.getRed()>60 && color.getRed() <255 && color.getGreen()>50 && color.getGreen() <190 && color.getBlue()<105)
    				cellColor++;
    			}
    			}
    			if (cellColor >= 1 )
    			cells[i][j].setStatus(Cell.WOOD);
    			cells[i][j].setCellType(new CellType(CellType.Type.WOOD));
    			} 
    			}
    		
    		
    	logic.setStarted(false);
    	runnedFirstTime = false;
    	repaint();
    	}
    	});
    
    loadImage.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    	//mainPanel.setVisible(false);
    	new imageloading();
    }
    });
    
    startButton.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    logic.setStarted(true);
    if (!runnedFirstTime)
    logic.startSimulation();
    }
    });
    
    doorButton.addMouseListener(new MouseAdapter() {
    	public void mouseClicked(MouseEvent e) {
    		
    		for (int i = 0; i < cells.length; i++) {
    			for (int j = 0; j < cells[0].length; j++) {
    			int cellColor=0;
    			int cellColorG=0;
    			int cellColorB=0;
    
    
    			for (int ii = 0; ii < cellSize; ii++) {
    			for (int jj = 0; jj < cellSize; jj++) {
    
    			// calculate new pixel position
    			int pixelPositionX = i * cellSize + ii;
    			int pixelPositionY = j * cellSize + jj;
    			int pixel = img.getRGB(pixelPositionX, pixelPositionY);
    			Color color = new Color(pixel);
    
    			if (color.getRed()==0 && color.getGreen()>0 && color.getBlue()==0)
    				cellColor++;
    			}
    			}
    
    			if (cellColor >= 1 )
    			cells[i][j].setStatus(Cell.DOOR);
    			cells[i][j].setCellType(new CellType(CellType.Type.DOOR));
    			} 
    			}
    	logic.setStarted(false);
    
    	runnedFirstTime = false;
    
    	repaint();
    	}
    	});
    
    edgeButton.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    	
    	//BufferedImage img = imageloading.mImage;
    	
    	for (int i = 0; i < cells.length; i++) {
    		for (int j = 0; j < cells[0].length; j++) {
    		int cellColorR=0;
    		int cellColorG=0;
    		int cellColorB=0;
    
    
    		for (int ii = 0; ii < cellSize; ii++) {
    		for (int jj = 0; jj < cellSize; jj++) {
    
    		// calculate new pixel position
    		int pixelPositionX = i * cellSize + ii;
    		int pixelPositionY = j * cellSize + jj;
    		int pixel = img.getRGB(pixelPositionX, pixelPositionY);
    		Color color = new Color(pixel);
    
    		if (color.getRed() < 10)
    		cellColorR++;
    		if (color.getGreen() < 10)
    		cellColorG++;
    		if (color.getBlue() < 10)
    		cellColorB++;
    		}
    		}
    
    		if (cellColorR > 1 && cellColorG > 1 && cellColorB > 1)
    		cells[i][j].setStatus(Cell.EDGE);
    		} 
    		}
    	
    	
    logic.setStarted(false);
    
    runnedFirstTime = false;
    
    repaint();
    }
    });
    
    add(mainPanel);
    
    gridPanel.addMouseMotionListener(mouseMotion);
    gridPanel.addMouseListener(mousePressed);
    }
    
    /**
    * @return this grid panel
    */
    public GridPanel getGridPanel() {
    return gridPanel;
    }
    
    /**
    * The panel that contains the grid.
    */
    public class GridPanel extends JPanel {
    private Graphics g;
    
    ArrayList shapes = new ArrayList();
    
    /**
    * overrides javax.swing.JComponent.paintComponent
    * 
    * @param g
    */
    protected void paintComponent(Graphics g) {
    super.paintComponents(g);
    this.g = g;
    //
    //BufferedImage img = imageloading.mImage;
     /*BufferedImage img = null;
     
    try {
        img = ImageIO.read(new File("C:\\Users\\Test 1\\Desktop\\alo5.jpg"));
    } catch (IOException ee) {
    }
    */
    //image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Test 1\\Desktop\\alo6.jpg");
    
    
    g.drawImage(img,0,0,img.getWidth(),img.getHeight(), this);
    
    int top = shapes.size();
    for (int i = 0; i < top; i++) {
       Shape s = (Shape)shapes.get(i);
       s.draw(g);
    }
    
    for (int i = 0; i < width; i += cellSize) {
    	for (int j = 0; j < height; j += cellSize) {
    	g.drawRect(i, j, cellSize, cellSize);
    	}
    	}
    //draw all cells
    for (int i = 0; i < width; i += cellSize) {
    for (int j = 0; j < height; j += cellSize) {
    boolean isIndexLegal = j /cellSize < cells[0].length && i / cellSize < cells.length;
    if (isIndexLegal) {
    if (GUI.cells[i / cellSize][j / cellSize].getStatus() == Cell.BURNING)
    drawBurningCell(i, j);
    else if (GUI.cells[i / cellSize][j / cellSize].getStatus() == Cell.WOOD)
    drawWoodBurningCell(i, j);
    else if (GUI.cells[i / cellSize][j / cellSize].getStatus() == Cell.DOOR)
    drawDoorCell(i, j);
    else if (GUI.cells[i / cellSize][j / cellSize].getStatus() == Cell.EMPTY)
    drawEmptyCell(i, j);
    else if (GUI.cells[i / cellSize][j / cellSize].getStatus() == Cell.EDGE)
    drawEdgeCell(i, j);
    }
    }
    }
    // dessine rectangle
    
    }
    
    public void addShape(Shape shape) {
        shape.setColor(Color.red);
        shape.reshape(10, 10, 50, 30);
        shapes.add(shape);
    }
    
    Shape clickedShape = null;  // This is the shape that the user clicks on.
    Shape draggedShape = null;  // This is null unless a shape is being dragged.
    int prevDragX;  // During dragging, these record the x and y coordinates of the
    int prevDragY;  //    previous position of the mouse.
    
    public void mousePressed(MouseEvent evt) {
    	if (draggedShape != null) {
    		return;
    	}
    	int x = evt.getX();  // x-coordinate of point where mouse was clicked
    	int y = evt.getY();  // y-coordinate of point 
    	clickedShape = null;  // This will be set to the clicked shape, if any.
    	for ( int i = shapes.size() - 1; i >= 0; i-- ) {  
    // Check shapes from front to back.
    		Shape s = (Shape)shapes.get(i);
    		clickedShape = s;
    				
    	}
    	if (clickedShape == null) {
    		return;
    	}
    	else if (evt.isPopupTrigger()) {
    		//popup.show(this,x-10,y-2);
    	}
    	else if (evt.isShiftDown()) {
    		shapes.remove(clickedShape);
    		shapes.add(clickedShape);
    		repaint();
    	}
    	else {
    		draggedShape = clickedShape;
    		prevDragX = x;
    		prevDragY = y;
    	}
    }
    
    public void mouseDragged(MouseEvent evt) {
    // User has moved the mouse.  Move the dragged shape by the same amount.
    if (draggedShape == null) {
    // User did not click a shape.  There is nothing to do.
    return;
    }
    int x = evt.getX();
    int y = evt.getY();
    draggedShape.moveBy(x - prevDragX, y - prevDragY);
    prevDragX = x;
    prevDragY = y;
    repaint();      // redraw canvas to show shape in new position
    }
    
    public void mouseReleased(MouseEvent evt) {
    	if (draggedShape == null) {
    		return;
    	}
    	int x = evt.getX();
    	int y = evt.getY();
    	if (evt.isPopupTrigger()) {
    //		popup.show(this,x-10,y-2);
    	}
    	else {
    		draggedShape.moveBy(x - prevDragX, y - prevDragY);
    		if ( draggedShape.left >= getSize().width || draggedShape.top >= getSize().height || draggedShape.left + draggedShape.width < 0 || draggedShape.top + draggedShape.height < 0 ) {  // shape is off-screen
    			shapes.remove(draggedShape);  // remove shape from list of shapes
    		}
    		repaint();
    	}
    	draggedShape = null;  // Dragging is finished.
    }
    
    public void mouseEntered(MouseEvent evt) { }   // Other methods required for MouseListener and 
    public void mouseExited(MouseEvent evt) { }    //              MouseMotionListener interfaces.
    public void mouseMoved(MouseEvent evt) { }
    public void mouseClicked(MouseEvent evt) { }
    
    public abstract class Shape {
    
        int left, top;      // Position of top left corner of rectangle that bounds this shape.
        int width, height;  // Size of the bounding rectangle.
        Color color = Color.white;  // Color of this shape.
        boolean drawOutline;  // If true, a black border is drawn on the shape
    
     void reshape(int left, int top, int width, int height) {
           // Set the position and size of this shape.
        this.left = left;
        this.top = top;
        this.width = width;
        this.height = height;
     }
     
     void setSize(int width, int height) {
           // Set the size of this shape
        this.width = width;
        this.height = height;
     }
    
     void moveBy(int dx, int dy) {
        left += dx;
        top += dy;
     }
    
     void setColor(Color color) {
            // Set the color of this shape
        this.color = color;
     }
     
     
     public void draw(Graphics g) {
     g.setColor(color);
     g.fillRect(left,top,width,height);
     if (drawOutline) {
        g.setColor(Color.black);
        g.drawRect(left,top,width,height);
     }
    }// Draw the shape in the graphics context g.
           // This must be overridden in any concrete subclass.
    
    }
    
    public class RectShape extends Shape {
        // This class represents rectangle shapes.
     public void draw(Graphics g) {
        g.setColor(color);
        g.fillRect(left,top,width,height);
        if (drawOutline) {
           g.setColor(Color.black);
           g.drawRect(left,top,width,height);
        }
     }
    }
    
    public void drawDoorCell(int xPos, int yPos) {
    	int gridsToTheLeft = xPos / cellSize;
    	int gridsFromTop = yPos / cellSize;
    	
    	g.setColor(new Color(0,100,0,100));
    	g.fillRect(gridsToTheLeft * cellSize, gridsFromTop * cellSize, cellSize, cellSize);
    }
    public void drawWoodBurningCell(int xPos, int yPos) {
    	int gridsToTheLeft = xPos / cellSize;
    	int gridsFromTop = yPos / cellSize;
    	
    	g.setColor(new Color(255,102,0,100));
    	g.fillRect(gridsToTheLeft * cellSize, gridsFromTop * cellSize, cellSize, cellSize);
    }
    
    public void drawBurningCell(int xPos, int yPos) {
    int gridsToTheLeft = xPos / cellSize;
    int gridsFromTop = yPos / cellSize;
    
    g.setColor(Color.RED);
    g.fillRect(gridsToTheLeft * cellSize, gridsFromTop * cellSize, cellSize, cellSize);
    }
    
    public void drawEdgeCell(int xPos, int yPos) {
    	int gridsToTheLeft = xPos / cellSize;
    	int gridsFromTop = yPos / cellSize;
    
    	g.setColor(new Color(0,0,255,100));
    	g.fillRect(gridsToTheLeft * cellSize, gridsFromTop * cellSize, cellSize, cellSize);
    	}
    
    public void drawEmptyCell(int xPos, int yPos) {
    int gridsToTheLeft = xPos / cellSize;
    int gridsFromTop = yPos / cellSize;
    
    g.setColor(new Color(255,255,0,100));
    g.fillRect(gridsToTheLeft * cellSize, gridsFromTop * cellSize, cellSize, cellSize);
    }
    }
    }
    
    
    the error is coming in the button segment:
    
    rectButton.addMouseListener(new MouseAdapter() {
    	public void mouseClicked(MouseEvent e) {
    	
    		//add rectangle shape
    		addshape(new RectShape());////////// new Rectangle() is underlined in red and says to create a new class
    		
    		logic.setStarted(false);
    		runnedFirstTime = false;
    		repaint();
    	}
    	});

  2. #2
    Join Date
    Jan 2009
    Posts
    596

    Re: Drawing Rectangles in Java

    I can't compile your code as it has references to two classes which are not defined: Cell and Logic.

    What exact error are you getting, and on which line?

    And please try to post the smallest possible amount of code which demonstrates the error, and which we can try compiling. That is, remove methods and classes which are not relevant to this error. The less code you post, the more willing people will be to take a look

  3. #3
    Join Date
    Mar 2012
    Posts
    4

    Arrow Re: Drawing Rectangles in Java

    i can send u all the classes if u give me an address

    the error is found here

    rectButton.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {

    //add rectangle shape
    addshape(new RectShape());//////////// this lines isnt recognized by the class but RectShape is present in the codes below

    logic.setStarted(false);
    runnedFirstTime = false;
    repaint();
    }
    });

  4. #4
    Join Date
    Jan 2009
    Posts
    596

    Re: Drawing Rectangles in Java

    Quote Originally Posted by Bips View Post
    i can send u all the classes if u give me an address
    I prefer to keep everything on the thread, rather than use private messaging or emails. That way anyone else who wants to join in can see everything that has been discussed.

    And my point was actually the opposite of what you are suggesting. I don't want to see more code, but less code - only that needed to demonstrate the error you are having.

    Quote Originally Posted by Bips View Post
    the error is found here

    rectButton.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {

    //add rectangle shape
    addshape(new RectShape());//////////// this lines isnt recognized by the class but RectShape is present in the codes below

    logic.setStarted(false);
    runnedFirstTime = false;
    repaint();
    }
    });
    What does 'isn't recognized' mean? Could you please post the error message from the compiler?

  5. #5
    Join Date
    Mar 2012
    Posts
    4

    Re: Drawing Rectangles in Java

    RectShape cannot be resolved to a type

    this is the error that i gets, the line addshape(new RectShape());

  6. #6
    Join Date
    Jan 2009
    Posts
    596

    Re: Drawing Rectangles in Java

    Quote Originally Posted by Bips View Post
    RectShape cannot be resolved to a type
    The RectShape class is not defined until later in the file. So when the compiler gets to this line, it doesn't know anything about RectShape.

  7. #7
    Join Date
    Mar 2012
    Posts
    4

    Re: Drawing Rectangles in Java

    what do u suggest me to do them? where should i place the class?

  8. #8
    Join Date
    Jan 2009
    Posts
    596

    Re: Drawing Rectangles in Java

    Quote Originally Posted by Bips View Post
    what do u suggest me to do them? where should i place the class?
    Before you use it
    Or, better, put each class in a separate file in the same directory.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured