- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在这里学习 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/
我是一名优秀的程序员,十分优秀!