2015-04-24 2 views
0

Я ожидал, что этот апплет, чтобы писать х = 0 и х = 10, но это не так:Как работает java paint()?

import java.applet.*; 
import java.awt.*; 
/* 
    <applet code="deney1" width=300 height=100> 
    </applet> 
    */ 
public class deney1 extends Applet { 
    int x=0; // current position 
    public void paint(Graphics g) { 
     g.drawString("x="+x, 0,20); 
     x+=10; 
     g.drawString("x="+x, 0,40); 
     x+=1; 
    } 
} 

Что здесь происходит?

EDIT: Предполагается, что мой вопрос является возможным дубликатом этого:

how is paint() running without being called in the main method?

Это сообщение говорит мне, что метод краска() будет работать без явного вызова. Но это не объясняет порядок выполнения операторов в paint(), и я не могу отслеживать напечатанные значения x. Почему не 0 и 10? Почему не 11 и 22? Для того, чтобы сделать вещи немного более ясным:

g.drawString("x="+x, 0,20);  // 1 
x+=10;       // 2 
g.drawString("x="+x, 0,40);  // 3 
x+=1;       // 4 

Похоже, что: 2 и 4 выполнены до 1 (х становится 11). Затем выполняется только 2 до 3 (x становится 21).

вопрос 1: Почему 2 и 4 выполнены до 1?

вопрос 2: учитывая ответ на вопрос 1, почему 4 не выполняется также во второй раз до 3?

+0

'awt' устарел с' swing'. 'swing' устарел с' JavaFX'. Это не будет отвечать на ваш вопрос, но это хороший совет: никогда не называйте его и не используйте 'JavaFX'. –

+2

Возможный дубликат [как работает paint() без вызова в основном методе?] (Http://stackoverflow.com/questions/7764602/how-is-paint-running-without-being-called-in-the -main-method) –

+0

Ваш код в порядке, проблема должна быть в другом месте. Возможно, в основном методе. – WonderWorld

ответ

0

Этот вопрос очень популярен:

how does paint() work

why is my code executing paintComponent(Graphics page) twice?

Why does the paint method run twice?

paint() in java applet is called twice for no reason

http://www.java-forums.org/awt-swing/58131-help-yet-another-paint-called-twice-thread.html

При первом запуске он печатает x = 0 x = 10, как я и ожидал. (x становится 11 в конце этого первого запуска). Затем метод paint() запускается снова (на этот раз, начиная с значения x 11) и печатает x = 11 x = 21, что является окончательным видом окна апплета.

Доказательство: Вы можете добавить код для приостановки программы в течение нескольких секунд после x + = 1, и когда вы запустите программу, сначала вы увидите x = 0 x = 10, после чего она изменится на x = 11 x = 21.

Что нужно взять домой: Напишите свой метод paint(), как если бы он выполнялся x раз (вы не можете заранее знать x). Поэтому не делайте в нем свои расчеты.

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