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);
}
}
}
这里是初学者。
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);
}
}
}