2013-10-15 8 views
0

привет, я новичок здесь, и я не очень хорошо разбираюсь в вопросах, но я искал это в Интернете целую вечность. вот мой вопрос: я хочу нарисовать прямоугольник с помощью мыши x и y. Я хочу, чтобы там было много прямоугольников, поэтому, если бы я щелкнул координату 50, 50 на JFrame, он нарисовал бы прямоугольник, а затем, если бы я щелкнул где-то еще, он нарисовал бы еще один прямоугольник, но не удалил бы другой, поэтому я мог бы щелкнуть 5 раз (< - пример), тогда у меня было бы пять прямоугольников сразу. Пожалуйста, помогите мне и сделайте это как можно проще. Заранее спасибо, пожалуйста, помогите мне.java: сразу несколько прямоугольников

мой код:

public class Game extends Canvas implements Runnable { 
    private static final long serialVersionUID = 1L; 

    public boolean running = false; 
    public static final String title = "tilebased game!"; 

    private Thread thread; 
    public int height = 600; 
    public int width = 800; 
    private Dimension d = new Dimension(width, height); 
    public static Rectangle block; 
    public static Rectangle[] blocks = new Rectangle[2]; 
    public static int blocknum = 0; 
    public static int xCreate; 
    public static int yCreate; 
    public static int xcoord; 
    public static int ycoord; 



    public Game() { 
     setPreferredSize(d); 
     setMinimumSize(d); 
     setMaximumSize(d); 
     addMouseListener(new tile()); 
     addMouseMotionListener(new tile()); 

    } 

    public void start() { 


     running = true; 
     new Thread(this).start(); 

    } 

    public void stop() { 

     running = false; 

    } 

    public static void main(String[] args) { 
     Game g = new Game(); 
     JFrame f = new JFrame(); 
     f.add(g); 
     f.pack(); 
     f.setTitle(title); 
     f.setResizable(false); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     g.start(); 

    } 

    public void run() { 
     while(running){ 
      tick(); 
      render(); 
     } 

     try{ 
      Thread.sleep(5); 
     }catch(Exception e){ 

     } 
    } 


    public void render() { 
     BufferStrategy bs = getBufferStrategy(); 
     if (bs == null) { 
      createBufferStrategy(2); 
      return; 
     } 
     Graphics g = bs.getDrawGraphics(); 

     tile.render(g); 




     g.dispose(); 
     bs.show(); 
    } 

    public void tick() { 

    } 

} 

и другой класс, реализующий MouseListener и MouseMotionListener:

public class listener implements MouseListener, MouseMotionListener { 

    public static Game game; 
    public Image img; 




    @Override 
    public void mouseDragged(MouseEvent arg0) { 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     Game.xcoord = e.getX(); 
     Game.ycoord = e.getY(); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) { 

     } 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) { 

     } 
    } 

} 

это добавить к моему вопросу. что было бы совместимо с моим кодом. (я все еще только изучаю java, кстати, и мне всего 13, а не очень умным). Прямоугольники должны иметь фиксированную высоту и ширину, поэтому, когда вы нажимаете на определенную область, она будет рисовать 10 x 10 прямоугольник, и он будет помнить все остальные прямоугольники, уже нарисованные, как в вашем примере, пожалуйста, помогите мне еще раз поблагодарить вас

+2

Что такое новая плитка()? – barwnikk

+0

1) * «Пожалуйста, помогите мне и сделайте это как можно проще». * Пожалуйста, задайте вопрос и отправьте сообщение по адресу [SSCCE] (http://sscce.org/). 2) Пожалуйста, добавьте письмо в верхнем регистре в начале предложений. Также используйте капитал для слова I, аббревиатуры и аббревиатуры, такие как JEE или WAR. Это облегчает людям понимание и помощь. –

ответ

2

См Custom Painting Approaches для рабочих примеров двух общих способов сделать это:

  1. живописи объектов из ArrayList
  2. painting на BufferedImage
+0

спасибо за ответ – user2279603

2

Есть два способа сделать это: каждый прямоугольник в списке и отображать их все (в правильном порядке , самые старые сначала, если они перекрываются), или создать BufferedImage, чтобы помнить все, что вы нарисовали до сих пор.

1

Если я правильно понял ваш вопрос, похоже, что вы хотите избежать перерисовки экрана при добавлении нового объекта. На веб-сайте Oracle есть демо, в котором показано, как рисовать объект при нажатии.

http://docs.oracle.com/javase/tutorial/uiswing/examples/painting/SwingPaintDemo4Project/src/painting/SwingPaintDemo4.java

Если вы хотите сохранить объекты (например. Не стирать предыдущую), закомментируйте строку

repaint(CURR_X,CURR_Y,CURR_W+OFFSET,CURR_H+OFFSET);

+0

OK спасибо, ребята, но это мне действительно не помогло (это немного помогло мне). что было бы совместимо с моим кодом. (я все еще только изучаю java, кстати, и мне всего 13, а не очень умным). Прямоугольники должны иметь фиксированную высоту и ширину, поэтому, когда вы нажимаете на определенную область, она будет рисовать 10 x 10 прямоугольник, и он будет помнить все остальные прямоугольники, уже нарисованные, как в вашем примере, пожалуйста, помогите мне еще раз поблагодарить вас – user2279603

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