为什么我点击的地方不绘制矩形?
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
中的 x
和 y
在构造 GuiDemo
时只分配了一次;在那个时间点,x1
和 y1
都被初始化为 0
。虽然 x1
和 y1
在单击时被重新分配,但此更改永远不会传播回 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());
警告:上面的代码未经测试,但我相信这会让您走上正确的道路。
这里是绘制矩形的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
中的 x
和 y
在构造 GuiDemo
时只分配了一次;在那个时间点,x1
和 y1
都被初始化为 0
。虽然 x1
和 y1
在单击时被重新分配,但此更改永远不会传播回 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());
警告:上面的代码未经测试,但我相信这会让您走上正确的道路。