为什么我点击的地方不绘制矩形?

Why won't the rectangle draw where I click?

这里是绘制矩形的class。它应该使用静态整数 x,y 作为要绘制的矩形位置的组件,它们是鼠标单击的 x 和 y 组件。 x,y 来自 event.getX() 和 event.getY() 的 Gui3 class。该程序及其所有方法都运行良好,唯一的问题是在绘制形状时出现。

Class画出形状

import java.awt.*;
import javax.swing.*;

public class DrawShapes extends JPanel {
    public static int x,y;
    public void paintComponent(Graphics g){
        g.setColor(Color.BLUE);
        g.fillRect(x,y,80,80);
    }
    public class GuiDemo extends Gui3{
        public GuiDemo(){
            x=x1;
            y=y1;
        }
        }

}

Main class 做其他所有事情

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;

public class Gui3 extends JFrame {
    private JPanel mousepanel;
    private JLabel statusbar;
    public static int x1=0, y1=0;
    public Gui3(){
        super("The title");

        mousepanel = new JPanel();
        mousepanel.setBackground(Color.WHITE);
        add(mousepanel, BorderLayout.CENTER);

        statusbar = new JLabel("Default");
        add(statusbar, BorderLayout.SOUTH);

        HandlerClass handler = new HandlerClass();
        mousepanel.addMouseListener(handler);
        mousepanel.addMouseMotionListener(handler);
    }   
    private class HandlerClass implements MouseListener, MouseMotionListener
        {
        @Override
        public void mouseClicked(MouseEvent event) {
            statusbar.setText(String.format("Clicked at %d, %d", event.getX(),event.getY()));

这是从

接收 x 和 y 分量的地方
x1=event.getX();
y1=event.getY();

组件被传递给 DrawShapes class。 矩形只在角落绘制。它应该是我点击的地方画的

                DrawShapes shapes = new DrawShapes();
                add(shapes);
            }
            @Override
            public void mousePressed(MouseEvent event){
                statusbar.setText("You pressed down the mouse");
            }

            @Override
            public void mouseReleased(MouseEvent event){
                statusbar.setText("You released the button");
            }
            @Override
            public void mouseEntered(MouseEvent event){
                statusbar.setText("You entered the area");
                mousepanel.setBackground(Color.RED);
            }
            @Override
            public void mouseExited(MouseEvent event){
                statusbar.setText("The mouse has left the window");
                mousepanel.setBackground(Color.WHITE);
            }
            //These are mouse motion events
            @Override
            public void mouseDragged(MouseEvent event){
                statusbar.setText("You are dragging the mouse");
            }
            @Override
            public void mouseMoved(MouseEvent event){
                statusbar.setText("You are moving the mouse");
            }
        }
    }

你在左上角看到矩形的原因是因为 DrawShapes 中的 xy 在构造 GuiDemo 时只分配了一次;在那个时间点,x1y1 都被初始化为 0。虽然 x1y1 在单击时被重新分配,但此更改永远不会传播回 DrawShapes class.

我有几个建议:

  • 完全摆脱静态变量。将事物从一个对象传递到另一个对象会更容易。 DrawShapes 应该有一个 x 和一个 y,我会让它们成为私有的(还有谁需要它们?)和非静态的(以防你需要多个 DrawShapes)
  • DrawShapes 添加一个 setPosition 方法,以便您可以将此位置传达给将绘制矩形的对象:

    public void setPosition(int newX, int newY) {
        this.x = newX;
        this.y = newY;
        repaint();
    }
    

    重绘在这里很重要(Java Swing 为您管理大量绘图工作,但如果您正在进行自定义绘图,则需要让它知道何时需要重绘。)

  • 点击发生时使用setPosition

    shapes.setPosition(event.getX(), event.getY());
    

警告:上面的代码未经测试,但我相信这会让您走上正确的道路。