2013-05-29 3 views
0

, поэтому я пытаюсь создать простую программу, в которой вы нажимаете на экран, и создает блок, который падает и сталкивается с большим блоком внизу и придерживается его. Вид как простая программа столкновения. Проблема в том, что когда я создаю один блок, он удаляет блок ранее. Я сделал массив, но он все еще делает это. Кто-нибудь из вас знает, что я делаю неправильно? Я уверен, что это простое исправление.Как рисовать несколько прямоугольников

public class Screen extends JPanel implements Runnable { 

public static JLabel statusbar; //displays a status bar showing what mouse movements are taking place 
private Image cat; //image of the cat 
public int xCoord ; //get the coordinates of the mouse pressed 
public int yCoord ; 
public int xCreate; 
public int yCreate; 
public Rectangle Ground; 
public Rectangle Block; 
public boolean isClicked = false; 
public int clickCount = 0; 
Rectangle blocks[] = new Rectangle[10]; 

int blocknum = 0; 

    public Screen(Frame frame) { 
      loadPic(); //calls the loadPic method above 
       Handlerclass handler = new Handlerclass(); //creates a new class to use the mouse motion listener 
        System.out.println("mouse works!"); 
     addMouseListener(handler); 
     addMouseMotionListener(handler); 
     statusbar = new JLabel("default"); 
      add(statusbar); 
    } 
    public void run(){ //this is the game run loop 
     System.out.println("this is running"); 
     try{ 
     } catch(Exception e) {} //exception handling 

    } 
    public void loadPic(){ //loads the picture from the other project but its the same pic 
     cat = new ImageIcon("C:\\Users\\Camtronius\\Documents\\NetBeansProjects\\Moving Block Proj\\src\\MovingBlock\\catIcon1.png").getImage(); //gets the image 
     System.out.println("Image Loaded!"); 
    } 

    @Override public void paintComponent(Graphics g){ 
     super.paintComponent(g); //paints the component, the picture, on top 
      Graphics2D g2d = (Graphics2D) g.create(); 

      g2d.drawImage(cat, xCoord, yCoord, null);  

      g2d.setColor(Color.BLUE); 
      Ground = new Rectangle(0,450,550,50); 
      g2d.fillRect(0,450, 550, 50); 

       for(Rectangle blocknum : blocks){ 
        if (blocks != null) {  
         g2d.setColor(Color.RED); 
         g2d.fillRect(xCreate,yCreate,50,50); 
         System.out.println(blocknum); 
        } 

       } 
       //move();   
    } 

    public void move(){ 
    if(yCreate<400){ 
     yCreate+=1; 
    }else{ 
     } 
    if(Ground.intersects(blocks[blocknum])){ 
      yCreate=400; 
      System.out.println("contains!"); 
     } 
    }  
    private class Handlerclass implements MouseListener, MouseMotionListener{ 
     public void mouseClicked(MouseEvent event){ 

     } 
     public void mousePressed(MouseEvent event){ 

     } 
     public void mouseReleased(MouseEvent event){ 

     if(blocknum<blocks.length){ 
      xCreate=event.getX(); 
      yCreate=event.getY(); 
      blocks[blocknum] = new Rectangle(50,50, xCreate, yCreate); 
      repaint(); 
     } 
     blocknum=blocknum+1; 
     } 
     public void mouseEntered(MouseEvent event){ 

     } 
     public void mouseExited(MouseEvent event){ 

     } 
     public void mouseDragged(MouseEvent event){ 

     } 
     public void mouseMoved(MouseEvent event){ 
      statusbar.setText(String.format("Coordinates are: %d, %d", event.getX(),event.getY())); 
      xCoord=event.getX(); 
      yCoord=event.getY(); 
     } 
    } 
} 

ответ

2

Картина - разрушительный процесс. То есть, когда новая краска цикл работает, то предыдущее содержимое Graphics контекста должно быть очищено ...

Итак, в вас paintComponent метод вы только покраску последний блок ...

if(isClicked = true){ 
    blocks[blocknum] = new Rectangle(50,50, xCreate, yCreate); 
    g2d.setColor(Color.RED); 
    g2d.fillRect(xCreate,yCreate,50,50); 
    System.out.println(blocknum); 
    repaint(); // THIS IS A BAD IDEA 
} 

НЕ ВЫЗЫВАЙТЕ любой метод, который может вызвать вызов repaint. Это поставит вас в потенциальный цикл смерти, который будет потреблять ваш процессор.

Вместо этого, вы должны петли через blocks массив и краски каждый один ...

for (Rectangle block : blocks) { 
    if (block != null) { 
     g2d.setColor(Color.RED); 
     g2d.fill(block); 
    } 
} 

И в вас mouseReleased метод, вы должны добавлять новые прямоугольники ...

public void mouseReleased(MouseEvent event){ 
    blocknum=blocknum+1; 
    if (blocknum < blocks.length) { 
     xCreate=event.getX(); 
     yCreate=event.getY(); 
     blocks[blocknum] = new Rectangle(xCreate, yCreate, 50, 50); 
    } 
} 

Я бы посоветовал вам взглянуть на Custom Painting, Painting in AWT and Swing и Concurrency in Swing для получения более подробной информации.

+0

Я добавил код, который вы предложили, и отредактировал его выше. Тем не менее, он по-прежнему рисует только один блок за раз. Что я могу делать неправильно? –

+0

Opps, я ошибся в коде 'mouseReleased' и обновил цикл' paintComponent' – MadProgrammer

+0

Я получил его! Спасибо, кучка! –

Смежные вопросы