Java: 调用实例化实例的方法

Java: Calling a method of an instanced instance

这里是初学者。

Main.java:

public int foo = 0;

public static void main(String[] args){
   Window f = new Window();
   // do some other stuff
}

public static void incrementFooEverySecond(){
 while(true){
   foo++;
   bar.repaint();    // <- Problem here!
   Thread.sleep(1000);
 }
}    

Window.java:

public class Window extends JFrame {
  public Window(){
    this.setSize(X, Y) //...
    Area bar = new Area();
}}

Area.java:

public class Area extends JPanel implements KeyListener {

method1(){
  super.paint(g);
  g.setColor(Color.RED);
  g.fillRect(foo, foo, B, D);
  this.repaint();
}}

除了第 1 条标记线外,这种方式效果很好。开始时, method1() 被执行(我不知道为什么,但这不是问题)。但是我需要在 Area 的唯一实例中从 Main 中的函数调用 repaint()method1(),但我不知道如何调用。谢谢你的想法。

请注意,我只复制和简化了最重要的代码块。

我无法回答为什么调用 method1(),因为您的问题中没有足够的代码来说明原因。

但是,行 bar.repaint(); 是一个问题,因为变量 bar 不在该代码的范围内。您在代码中显示的 bar 的唯一实例是在 Window class 的构造函数中创建的,并在该方法结束时超出范围。

要解决此问题,您需要将实例变量 bar 添加到您的 Window class 中,如下所示:

public class Window extends JFrame {
    private Area bar;

    public Window(){
        this.setSize(X, Y) //...
        bar = new Area();   
    }
}

然后,您需要一种方法来公开重绘功能,例如:

public class Window extends JFrame {
    private Area bar;

    public Window(){
        this.setSize(X, Y) //...
        bar = new Area();   
    }

    public void repaintBar() {
        bar.repaint();
    }
}

现在在您的 Main class 中(Window f 与上述 Area bar 的问题相同):

public class Main {
    static Window f;
    public int foo = 0;

    public static void main(String[] args){
        f = new Window();
        // do some other stuff
    }

    public static void incrementFooEverySecond(){
        while(true){
            foo++;
            f.repaintBar();
            Thread.sleep(1000);
        }
    }
}