我正在尝试使用 swing 开发一个 GUI 界面,其中组件可以通过监听器与其他组件进行通信。我遇到的问题是:-
方法
- 实现监听器
- 使用匿名方法通过监听器方法添加监听器
- 从实现监听器的类中添加监听器
问题
- 在处理大量对象时,实现监听器会导致尝试对对象进行操作造成困惑
- 与 1 相同,只是构造函数需要匿名方法的final
- 如果不诉诸静态引用,就无法对监听类之外的对象进行操作。
这确实令人沮丧,因为我如何才能让 MouseListenerClass 在作为单独 JFrame 类一部分的 JPanel 上进行绘制,而不将 JPanel 传递给 mouseListenerClass 来对其进行操作。
我似乎唯一能工作的方法是创建一个名为 MouseState 的枚举,当触发鼠标事件 MousePressed 时,它将静态枚举 mouseStatus 设置为按下,然后 JPanel PaintComponent 方法检查枚举 mouseStatus 并绘制是否有按下.
这似乎是错误的方式。
还有别的办法吗?
更新以反射(reflect) Cyrille 的评论:-
谢谢@Cyrille,我不得不使用转换来修改你的代码,但前提仍然有效。 ' 公共(public)无效mousePressed(MouseEvent e){
PaintPanel p=(PaintPanel) getTargetPanel();
p.setMousePressed(true);
p.setMouseCoords(e.getPoint());
}
public void mouseReleased(MouseEvent e) {
PaintPanel p=(PaintPanel) getTargetPanel();
p.setMousePressed(false);
}
public JPanel getTargetPanel() {
return targetPanel;
}'
最佳答案
您的鼠标监听器不应在 JPanel 上绘制。相反,您应该使用 MVC(模型- View -控制)模式。
作为示例,您将设置 3 个类:面板、监听器和用于保存数据的类(模型类)。当监听器被触发时,它应该编辑模型。然后,模型可以通知面板某些内容发生了变化,面板可以检查模型中的数据并绘制适当的像素。请参阅http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller了解更多信息。
顺便说一句:这是大多数标准 Swing 组件的工作方式。只有非常简单的组件(JPanel、JTextField 等)允许不使用,并且基于这些组件制作复杂的组件您应该使用 MVC
关于java - 如何处理 java swing 组件事件而不创建一个困惑的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17490696/