Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么赢了';在我点击的地方画矩形?_Java_Swing_Paintcomponent - Fatal编程技术网

Java 为什么赢了';在我点击的地方画矩形?

Java 为什么赢了';在我点击的地方画矩形?,java,swing,paintcomponent,Java,Swing,Paintcomponent,下面是绘制矩形的类。应该使用静态int x,y作为要绘制的矩形位置的组件,即鼠标单击的x和y组件。x,y来自event.getX()和event.getY()的Gui3类。该程序及其所有方法都很好地工作,唯一的问题是在绘制形状时出现 类来绘制形状 import java.awt.*; import javax.swing.*; public class DrawShapes extends JPanel { public static int x,y; public void

下面是绘制矩形的类。应该使用静态int x,y作为要绘制的矩形位置的组件,即鼠标单击的x和y组件。x,y来自event.getX()和event.getY()的Gui3类。该程序及其所有方法都很好地工作,唯一的问题是在绘制形状时出现

类来绘制形状

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;
        }
        }

}
完成其他所有操作的主类

 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类。 矩形仅在角处绘制。应该在我点击的地方画


在左上角看到矩形的原因是,在构建
GuiDemo
时,
DrawShapes
中的
x
y
仅指定一次;此时,
x1
y1
都被初始化为
0
。当单击后重新分配
x1
y1
时,此更改不会传播回
DrawShapes

我有几个建议:

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

    public void setPosition(int newX, int newY) {
        this.x = newX;
        this.y = newY;
        repaint();
    }
    
    重绘在这里很重要(JavaSwing为您管理大量的绘图工作,但是如果您正在进行自定义绘制,则需要让它知道何时需要重绘。)

  • 单击时使用该
    setPosition

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

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

您之所以看到左上角的矩形,是因为DrawShapes中的xy在构建GuiDemo时只分配一次;此时,
x1
y1
都被初始化为
0
。当单击后重新分配
x1
y1
时,此更改不会传播回
DrawShapes

我有几个建议:

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

    public void setPosition(int newX, int newY) {
        this.x = newX;
        this.y = newY;
        repaint();
    }
    
    重绘在这里很重要(JavaSwing为您管理大量的绘图工作,但是如果您正在进行自定义绘制,则需要让它知道何时需要重绘。)

  • 单击时使用该
    setPosition

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

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

请使缩进可读并修改格式。我觉得您错过了一个重新绘制的地方,“应该使用静态整数x,y”-嗯,开始时有个问题请让缩进可读并修改格式。我觉得你错过了一个“应该使用静态整数x,y”的
重新绘制
的地方-好吧,开始时有个问题工作得很好!谢谢:)你能解释一下如何以及何时使用重绘方法吗?效果很好!谢谢:)你能解释一下如何以及何时使用重绘方法吗?