0

嗨,我是新来的,我不擅长解释问题,但我已经在网上搜索了很多年。这是我的问题:我想在鼠标 x 和 y 处绘制一个矩形。我希望有很多矩形,所以如果我要单击 JFrame 上的 50 ,50 坐标,它将绘制一个矩形,然后如果我单击其他地方,它将在那里绘制另一个矩形,但不会删除另一个矩形,所以我本来可以点击 5 次(<--example),然后我会同时拥有五个矩形。请帮助我并使其尽可能简单。提前谢谢你,请帮助我。

我的代码:

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() {

    }

}

和另一个实现MouseListenerand的类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矩形,它会记住你的例子中已经绘制的所有其他矩形,请再次帮助我,谢谢

4

3 回答 3

2

有关执行此操作的两种常用方法的工作示例,请参阅自定义绘画方法:

  1. 从 ArrayList 绘制对象
  2. 在 BufferedImage 上绘画
于 2013-10-15T17:08:52.393 回答
2

有两种方法可以做到这一点,要么记住列表中的每个矩形并将它们全部渲染(以正确的顺序,最旧的在前,以防它们重叠),或者创建一个 BufferedImage 来记住你到目前为止绘制的所有内容。

于 2013-10-15T16:52:04.817 回答
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);

于 2013-10-15T16:52:06.177 回答