java - 如何处理 java swing 组件事件而不创建一个困惑的类?

标签 java swing events methods listener

我正在尝试使用 swing 开发一个 GUI 界面,其中组件可以通过监听器与其他组件进行通信。我遇到的问题是:-

方法


  1. 实现监听器
  2. 使用匿名方法通过监听器方法添加监听器
  3. 从实现监听器的类中添加监听器

问题


  1. 在处理大量对象时,实现监听器会导致尝试对对象进行操作造成困惑
  2. 与 1 相同,只是构造函数需要匿名方法的final
  3. 如果不诉诸静态引用,就无法对监听类之外的对象进行操作。

这确实令人沮丧,因为我如何才能让 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/

相关文章:

java - 在 BoxLayout 中调整 JButton 的大小

c# - 删除事件处理程序

java - 通过事件处理插入图像?

java - 欧拉计划 97

java - WebSphere 7 中通过 JNDI 的应用程序和模块名称

java - 2020-04-03 20 :17:46 to "yyyy-MM-dd' T'HH:mm:ss"format

java - java中自动调整组件大小

java - java swing中的定位

c# - C# : using -= operator by events? 是什么意思

java - 安卓 OpenGL ES : How do you select a 2D object?