gpt4 book ai didi

java - 如何将运动监听器分离到不同的类?

转载 作者:行者123 更新时间:2023-11-30 03:49:18 27 4
gpt4 key购买 nike

我正在尝试自学 Java,但我被难住了。我今天要么练习太多了,要么只是有一个愚蠢的时刻。

我正在使用绘图和 MouseMotionListener 以便能够在屏幕上拖动图形,并且我希望将 MouseMotionListener 作为一个单独的类。

关于问题:

如何将代码中的监听器分离到单独的类中?当我尝试将其放入另一个类时,我最终只是进行了循环引用。

代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;


@SuppressWarnings("serial")
class Class1 extends JFrame implements MouseMotionListener{

Point p,p2;


public Class1(){
p = new Point(0,0);
this.setSize(500,500);
//this.setUndecorated(true);
//this.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.01f));
this.addMouseMotionListener(this);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[]args){
new Class1();
}

public void paint(Graphics g){
g.setColor(Color.gray);
g.fillRect(0, 0, 500, 500);
}

public void paintSquare(Graphics g){
g.fillRect(p.x, p.y, 50, 50);
}

public void paintCover(Graphics g){
g.setColor(Color.gray);
g.fillRect(p2.x, p2.y, 50, 50);
}

@Override
public void mouseDragged(MouseEvent e) {
p2=p;
p=e.getPoint();
p.translate(-25, -25);
paintCover(this.getGraphics());
paintSquare(this.getGraphics());
}

@Override
public void mouseMoved(MouseEvent e) {
//do nothing
}

}

最佳答案

开始将您的逻辑划分为责任区域......

您需要:

  • 渲染输出的东西
  • 维持输出当前状态的东西
  • 改变输出当前状态的东西

让我们从模型开始......

该模型维护有关输出当前状态的信息,它提供了一种可以更改状态的方法,并可以生成通知以告知感兴趣的各方状态已更改。

View 负责渲染模型的状态并监听模型状态的变化,以便在模型变化时能够 self 更新...

MouseMotionListener(在本例中)将用于修改模型的状态...

View 和MouseMotionListener都将引用模型,这样,模型将充当各个组件之间的桥梁。 MouseMotionListener 将用于更新模型,模型将触发对 View 的通知, View 将绘制模型的当前状态。

看看model-view-controller了解更多详情。

此外,Swing 中的自定义绘制通常是通过重写从 JComponent 扩展的类的 paintComponent 方法来完成的。您应该避免覆盖顶级容器(例如 JFrame)的 paint 或使用 getGraphics。看看Performing Custom Painting了解更多详情

关于java - 如何将运动监听器分离到不同的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com