2015-02-02 6 views
0

Начинающий здесь.Java: вызов метода экземпляра экземпляра

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() (я не знаю, почему, но это не проблема). Но мне нужно вызвать repaint() или method1() в единственном экземпляре Area из функции Main, и я не могу понять, как это сделать. Спасибо за ваши мысли.

Обратите внимание, что я скопировал и упростил только самые важные куски кода.

+0

Является ли 'method1()' фактическим именем? или называется 'Area()'? – TheUknown

ответ

2

Я не могу ответить, почему method1() называется, поскольку в вашем вопросе недостаточно кода, чтобы показать, почему.

Однако, строка bar.repaint(); является проблемой, потому что переменная bar не имеет для этого кода. Единственный экземпляр bar, который вы показываете в коде, создается внутри конструктора вашего класса Window и выходит за пределы области действия в конце этого метода.

Чтобы решить эту проблему, вам нужно будет добавить экземпляр переменной bar к классу окна, как это:

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 классе (та же самая проблема для 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); 
     } 
    } 
} 
+1

Я думаю, что это хороший ответ, и Джейсон побеспокоился объяснить ответ на заданный вами вопрос. Имейте в виду, что, поскольку вы показываете неполный код, вы можете сделать то, что он предложил, и все еще иметь его. Я говорю это по двум причинам: практически по определению вы не можете быть уверены, что такое «важные куски кода» на самом деле, и вы пытаетесь программировать GUI (сложный), прежде чем понимать переменную область (базовую). Удачи вам. И если Джейсон ответит на ваш вопрос, отметьте его как ответ; если бы это было полезно, также повышайте его, вот так работает SO. – arcy

Смежные вопросы