【问题标题】:Draw a Rectangle Using Mouse Click使用鼠标单击绘制矩形
【发布时间】:2018-10-27 23:48:40
【问题描述】:

在我的 JFrame 屏幕上单击鼠标时绘制矩形时遇到问题。我尝试了几种不同的方法,我得到的最接近的方法就是让坐标出现。由于某种原因,任何绘图似乎都被忽略了。

package pathfinder;

import java.awt.BorderLayout;
import java.awt.Canvas;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;

public class forLoopDesign extends JPanel{

//offsets for hard-coded path
int hOffset = 40;
int vOffset = 40;

//check if adjacent block is wall
boolean wall = false;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    draw(g);
}

public void draw(Graphics g) {
   //draw start and end points
    g.setColor(Color.magenta);
    g.fillRect(0, 0, 40, 40);
    g.setColor(Color.white);
    g.drawString("Start", 7, 24);
    g.setColor(Color.red);
    g.fillRect(720, 720, 40, 40);
    g.setColor(Color.white);
    g.drawString("Finish", 724, 744);

   //draw grid
    g.setColor(Color.black);       
    for(int i=0; i<760; i+=40){
        for(int j=0; j<800; j+= 40){
            g.drawRect(i, j, 40, 40);
        }
    }

   //draw hard-coded path
    g.setColor(Color.cyan);
    for(int i=0; i< 17; i++){
        g.fillRect(hOffset + 1, vOffset + 1, 39, 39);
        hOffset += 40;
        vOffset += 40;
    }

   //check for mouse click, print coordinates
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            System.out.println("(x, y) of mouse click= (" + x + ", " + y + ")");
            g.setColor(Color.orange);
            g.fillRect(200,200,40,40);
        }
    });
}

//draw wall at mouse click location
public void highlightSquare(int x, int y, Graphics g){
    wall = true;
    System.out.println("wall value=" + wall);

    g.setColor(Color.black);
    g.fillRect(x, y, 40, 40);
}

//initialize jframe properties
public static void main(String[] args) {
    JFrame f = new JFrame();
    f.getContentPane().add(new forLoopDesign(), BorderLayout.CENTER);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(767, 790);
    f.setVisible(true);
    f.setResizable(false);
    f.setLocationRelativeTo(null);
}}

我的最终目标是能够在屏幕上绘制矩形以创建迷宫般的屏幕并让程序在其中导航(青色方块)。这是一个雄心勃勃的项目,我意识到到目前为止我可能犯了很多错误,所以请随意添加您可能有的任何其他批评。提前致谢

【问题讨论】:

    标签: java swing


    【解决方案1】:

    所有自定义绘制都需要在paintComponent(..) 方法中完成。

    因此,在您的mouseClick 逻辑中,您需要保存单击ArrayList 的点并调用repaint()。然后paintComponent(...)方法需要遍历ArrayList在给定点绘制矩形。

    请参阅Custom Painting Approaches 中的DrawOnComponent 示例,了解此方法的工作示例。

    【讨论】:

    • 你能举个例子吗?在我的代码中调用“repaint()”会清除我现在拥有的东西,而不是画出新的形状。我想保留屏幕上的内容并在顶部添加新形状。对不起,如果我很难,还在搞清楚 java
    • 阅读您评论的最后一行,道歉
    • Calling 'repaint()' in my code clears what I have right now rather than drawing out the new shape - 是的,每当绘制组件时,第一步是清除背景,然后重新绘制所有内容,这就是为什么您需要遍历 ArrayList 以再次重新绘制。跨度>
    • @Tylerxc,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多