Java 为什么赢了';在我点击的地方画矩形?
下面是绘制矩形的类。应该使用静态int x,y作为要绘制的矩形位置的组件,即鼠标单击的x和y组件。x,y来自event.getX()和event.getY()的Gui3类。该程序及其所有方法都很好地工作,唯一的问题是在绘制形状时出现 类来绘制形状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
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
重绘在这里很重要(JavaSwing为您管理大量的绘图工作,但是如果您正在进行自定义绘制,则需要让它知道何时需要重绘。)public void setPosition(int newX, int newY) { this.x = newX; this.y = newY; repaint(); }
- 单击时使用该
setPosition
shapes.setPosition(event.getX(), event.getY());
警告:上面的代码未经测试,但我相信这将使您走上正确的道路。您之所以看到左上角的矩形,是因为
DrawShapes
中的x
和y
在构建GuiDemo
时只分配一次;此时,x1
和y1
都被初始化为0
。当单击后重新分配x1
和y1
时,此更改不会传播回DrawShapes
类
我有几个建议:
- 完全摆脱静态变量。从一个对象传递到另一个对象更容易
应该有一个DrawShapes
和一个x
,我会将它们设置为私有(还有谁需要它们?)和非静态(以防您需要多个y
)DrawShapes
- 将
方法添加到setPosition
,这样您就可以将此位置传达给将绘制矩形的对象:DrawShapes
重绘在这里很重要(JavaSwing为您管理大量的绘图工作,但是如果您正在进行自定义绘制,则需要让它知道何时需要重绘。)public void setPosition(int newX, int newY) { this.x = newX; this.y = newY; repaint(); }
- 单击时使用该
setPosition
shapes.setPosition(event.getX(), event.getY());
警告:上面的代码未经测试,但我相信这将使您走上正确的道路。请使缩进可读并修改格式。我觉得您错过了一个
重新绘制的地方,“应该使用静态整数x,y”-嗯,开始时有个问题请让缩进可读并修改格式。我觉得你错过了一个“应该使用静态整数x,y”的重新绘制的地方-好吧,开始时有个问题工作得很好!谢谢:)你能解释一下如何以及何时使用重绘方法吗?效果很好!谢谢:)你能解释一下如何以及何时使用重绘方法吗?