gpt4 book ai didi

java - 你如何处理java swing组件事件而不制作凌乱的类?

转载 作者:行者123 更新时间:2023-12-04 04:50:40 25 4
gpt4 key购买 nike

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

8年前关闭。



Improve this question




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

方法

  • 实现监听器
  • 使用匿名方法添加带有监听器方法的监听器
  • 从实现监听器的类中添加监听器

  • 问题

  • 在处理大量对象时,实现监听器会造成试图操作对象的困惑
  • 与 1 相同,只是构造函数需要匿名方法的 finals
  • 不能在不求助于静态引用的情况下对监听类之外的对象进行操作。

  • 这真的很令人沮丧,因为我怎样才能让 MouseListenerClass 在作为单独 JFrame 类的一部分的 JPanel 上绘制,而无需将 JPanel 传递给 mouseListenerClass 对其进行操作。

    我似乎已经开始工作的唯一方法是创建一个名为 MouseState 的 Enum,当鼠标事件 MousePressed 被触发时,它将静态 Enum mouseStatus 设置为按下,然后 JPanel 的paintComponent 方法检查 Enum mouseStatus 并在按下时进行绘制。

    这似乎是错误的方式。

    还有其他方法吗?

    更新以反射(reflect) Cyrille 的评论:-

    谢谢@Cyrille 我不得不通过使用强制转换来修改你的代码,但前提仍然有效。 '
    public void 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 的子类来处理绘画,并在此类中提供一个方法供监听器与之通信:

    public class MyPanel extends JPanel {

    // status used for drawing, can be anything you want, but let's say you need to know if the mouse is pressed.
    private boolean isMousePressed;

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // do your stuff here, using isMousePressed
    }

    public void setMousePressed(boolean pressed) {
    isMousePressed= pressed;
    }
    }

    然后,您的鼠标监听器必须引用 MyPanel 实例并使用正确的方法与其进行通信。
    public class PaintingMouseListener implements MouseListener {

    private final JPanel targetPanel;


    public PaintingMouseListener(JPanel targetPanel) {
    this.targetPanel = targetPanel;
    }


    @Override
    public void mousePressed(MouseEvent e) {
    targetPanel.setMousePressed(true);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    targetPanel.setMousePressed(false);
    }

    // other methods of the listener
    }

    然后使用对面板的引用创建鼠标监听器。
        MyPanel targetPanel = new MyPanel();
    // assign the mouse listener to whatever component needs it.
    component.addMouseListener(new PaintingMouseListener(targetPanel));

    这类似于 MVC 解决方案,不同之处在于它将模型(变量 isMousePressed)和 View (MyPanel)放在一起。对于这么简单的东西,把它们放在一起更简单,但随着事情变得越来越复杂,最好把它们分开,把模型放在一个类中。

    关于java - 你如何处理java swing组件事件而不制作凌乱的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17490696/

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