【问题标题】:Communictating between classes using Jpanel, repaint() method使用 Jpanel,repaint() 方法在类之间进行通信
【发布时间】:2014-02-22 04:43:30
【问题描述】:

我有一个扩展 JPanel 的“GUI”类。我有另一个扩展 JFrame 的类“按钮”。当在 JFrame 上按下 JButton“clearB”时,我试图让 JFrame 类在 JPanel 类中调用方法“clearScreen()”。 我可以完成这项工作的唯一方法是在 JButton 的 actionlistener 中为 JPanel 类“GUI”构建对象:

clearB.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        GUI g = new GUI();
                        g.clearScreen();

                    }
                }
            );

但是当我调用方法 clearScreen() 时,它看起来像这样:

public void clearScreen(){
        xs.clear();
        ys.clear();
        count = 0;
        repaint();
    }

什么也没发生。我猜这是因为 repaint() 方法由于某种我不知道的原因而不起作用。 有人请向我展示一种更简单、更有效的方式来完成我在这里想要完成的工作。 谢谢! :D

【问题讨论】:

    标签: java swing jpanel actionlistener


    【解决方案1】:

    您的 ActionListener 不起作用的原因是因为您在其中创建的 GUI 对象是一个 new GUI 对象,它与显示的 GUI 对象完全无关,因此在未显示的 GUI 实例上调用 clearScreen() 方法对显示的 GUI 实例没有影响。

    解决方案是让您的 Buttons 类保存对可视化 GUI 对象的有效引用,并在此引用上调用方法。可以通过 setter 方法或构造函数参数传递引用。

    即,

    public class Buttons {
      private GUI gui;
    
      public Buttons (GUI gui) {
        this.gui = gui;
      }
    
        // in some ActionListener code...
        gui.someMethod();
    }
    

    几个cmets:

    • 您必须拥有一个扩展 JFrame 的类是不寻常的。我自己,除非必要,否则我尽量避免这样做,而是通常从 JFrame 类本身创建我的 JFrame,并且仅在需要时。
    • 我有点惊讶您的主窗口类还没有 GUI 变量,因为它可能会显示 GUI 实例。

    【讨论】:

    • 走下记忆之路——哇,两年前我真是个菜鸟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多