gpt4 book ai didi

java - 我可以在哪里放置鼠标事件处理代码,以便它不妨碍但仍然可以操作对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:22 25 4
gpt4 key购买 nike

我正在这里学习 Java 并尝试掌握类以及如何最好地为我的小游戏捕获鼠标事件等,所以请耐心等待并给我一些提示。

我的项目的主类扩展了 JFrame,并在构建时向自身添加了一个扩展 JPanel 的类的对象。这个 JPanel 覆盖了整个窗口,我用它来在屏幕上绘制内容。然后我有一个名为 Scene 的类,它只扩展了对屏幕上当前对象的所有引用,并负责编译它们并将它们传递回 JPanel。我不想将完整的鼠标事件代码放在 JPanel 中,因为它会很困惑,所以我虽然为它创建了另一个名为 MEs 的类,并让每个场景都有一个。我的想法是,这样每个 mes 对象都可以轻松访问每个场景中的对象。所以我的代码看起来像这样:

class DPanel extends JPanel {
Scene scCurrent;

public DPanel() {
scCurrent = new Scene();
addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent me) { scCurrent.mes.moved(me); }
});
...
}

...

当然,在 scCurrent.mes.moved() 中 我什至不知道如何更改光标。它无法识别其中的 setCursor()。我如何更改光标并访问树上更高的对象,就像我需要切换场景一样?或者是否有其他地方可以存放我的鼠标事件处理代码,这些代码不会从我的 JPanel 中弹出?

最佳答案

您正在尝试将控制代码与 View (GUI) 代码分开,这是一件好事。一种解决方案是为 View 代码提供允许外部代码更改其状态的公共(public)方法,并为控件类提供对 View 的引用,以便控件(即 MouseListeners、MouseMotionListeners、ActionListeneres)可以在适当的引用上调用这些方法并更改 View 的状态。

编辑 1
向您展示一个示例可能会更容易:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class ViewControl {

private static void createAndShowGui() {
View view = new View();
Control control = new Control(view);
view.addMouseAdapter(control);

JFrame frame = new JFrame("ViewControl");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(view);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

@SuppressWarnings("serial")
class View extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private List<Point> points = new ArrayList<Point>();

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (points.size() > 1) {
for (int i = 0; i < points.size() - 1; i++) {
int x1 = points.get(i).x;
int y1 = points.get(i).y;
int x2 = points.get(i + 1).x;
int y2 = points.get(i + 1).y;

g.drawLine(x1, y1, x2, y2);
}
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}

public void addMouseAdapter(MouseAdapter adapter) {
// addMouseListener(adapter);
addMouseMotionListener(adapter);
}

public void addPoint(Point p) {
points.add(p);
repaint();
}
}

class Control extends MouseAdapter {
private View view;

public Control(View view) {
this.view = view;
}

@Override
public void mouseDragged(MouseEvent e) {
view.addPoint(e.getPoint());
}
}

关于java - 我可以在哪里放置鼠标事件处理代码,以便它不妨碍但仍然可以操作对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304585/

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