[Java] Работа update()

SergeRRRRRR

есть цикл, например такой

public int i=0;
for(i=0;i<3;i++){
repaint;
}
public void paint(Graphics g){
Integer k=i;
g.SetFont(new Font("arial",Font.Bold,20;
g.drawString(k.toString50,50);
}

проблема в том, что выводится только числа 0 и 3. 0 - из-за первичной прорисовки, 3 видимо после того, как цикл отработал. Я ожидал вывод 0,0,1,2. В чем фишка? Я так понимаю, что-то с потоком..но хз точно. Сильно не бейте, только начал изучать java.

danilov

Могу ошибаться, но вроде сама отрисовка происходит в другом потоке. То есть, ты 3 раза просишь перерисовать, а когда оно по факту рисует, там уже 3.

Dasar

_Ss говорит почти верно.
repaint ничего не рисует, он лишь ставит сообщение о том, что изображение должно быть перерисовано.
сама же перерисовка происходит только после того, как функция (в которой цикл) закончится, и отдаст управление циклу сообщений

SergeRRRRRR

хи, тогда почему,когда я вставляю в цикле после repaint задержку а-ля
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
return;
}

то все норм, отображает как задумано ( 0,1,2 причем если поставить этот блок перед repaint в цикле,то цифра 3 все-таки будет выведена (0,1,2,3).

danilov

сама же перерисовка происходит только после того, как функция (в которой цикл) закончится, и отдаст управление циклу сообщений
Для этого сам цикл должен происходить в AWTEventDispatcher или как его там зовут.
Судя по написанному позже, это не так.

kill-still

Ну есть же классические примеры:
http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Colorf...

kill-still

как-то так:

import javax.swing.*;
import java.awt.*;

public class Test extends JPanel {

private Integer i = 0;

public Test {
new Thread {
public void run {
while (true) {
repaint;
i++;
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}.start;
}

public void paint(Graphics g) {
super.paint(g);
g.setFont(new Font("Serif", Font.PLAIN, 40;
g.drawString(i.toString 40, 20);
}

public static void main(String[] args) {
JFrame frame = new JFrame("Color fading aniamtion");
frame.add(new Test;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 150);
frame.setVisible(true);
}
}

Dasar

тогда почему,когда я вставляю в цикле после repaint задержку а-ля
тогда значит все-таки repaint вызывает paint (а не просто ставит сообщение но перерисовка происходит так быстро, что ты успеваешь увидеть только последний кадр

ifani

тогда значит все-таки repaint вызывает paint (а не просто ставит сообщение но перерисовка происходит так быстро, что ты успеваешь увидеть только последний кадр
выше написал всё абсолютно правильно:
paint вызывается в EDT, а repaint лишь отправляет запрос на вызов paint. Соответственно, если цикл топикстартера отрабатывал в EDT, то да, фактически paint может вызваться только после выхода из цикла. Но если не в EDT, то отправляется серия асинхронных запросов на перерисовку, а java из соображений оптимизации имеет право объединить несколько запросов на перерисовку в один (конкретный алгоритм объединения зависит от реализации). Думаю, как раз такое объединение и происходило у топикстартера.
ЗЫ:
Но вообще, конечно, странно желать увидеть весь отсчёт и не поставить задержку между перерисовками - это ж, в любом случае, невозможно было бы увидеть :)

kill-still

только не объединить, а просто выкинуть из очереди все дублирующие мессаги.

ifani

В данном случае объединение эквивалентно выкидыванию, да :)
Но вообще repaint рекомендуется вызывать с указанием области перерисовки, и тогда java может именно объединить эти области в одну и обновить её за один раз.

SergeRRRRRR

хм, привел код примерно к структуре своего кода и не фига не работает
 
import javax.swing.*;
import java.awt.*;


public class Test extends JFrame {

private Integer i = 0;

public void proc {

while (true) {
repaint;
i++;
try {
Thread.sleep(2000);
} catch (Exception e) {
}
}
}
public void paint(Graphics g) {

g.setFont(new Font("Serif", Font.PLAIN, 40;
g.drawString(i.toString 40, 20);
}

public static void main(String[] args) {
Test frame = new Test;

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 150);
frame.setVisible(true);
frame.proc;
}
}

P..S 2, спасибо за пояснение, тупанул я.

kill-still

ну а с чего ему работать?
ты знаешь, что такое поток и замыкание? зачем ты их удалил?
посмотри пример в Color fading animation - может так тебе понятнее будет.

SergeRRRRRR

Вот код проги, тут я не создаю поток и не реализую интерфейс runnable, но все работает.. ЧЯДНТ?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.Authenticator;

import java.net.PasswordAuthentication;
import java.net.URL;

import java.io.*;
import javax.imageio.*;


public class Test extends JFrame {
private Source[] sources;

// private String host;
public int l=0; //флаг вызова repaint по щелчку мыши
public int m=0,a; // m - для проверки того, что repaint вызван из цикла; a - индекс массива
public Image[][] i; // массив, куда сохраняются картинки с сайтов
public int k,p; // k - первый индекс, p второй, используются при заполнении


Test(Source... source) throws HeadlessException {
this.sources = source;
}

public void process {
// Exitig program on mouse click
addMouseListener(new MouseListener {
public void mouseClicked(MouseEvent e) {
l=1;
repaint;
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}
}
);

addKeyListener(new KeyListener {
@Override
public void keyTyped(KeyEvent e) {
System.exit(0);
}

@Override
public void keyPressed(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
}
});



// создаем массив
k=-1;
i=new Image[sources.length][];
for (Source source : sources) {
k++;
for (String url : source.getUrls
i[k]=new Image[source.getUrls.length];
}

// заполняем
while (true) {
k=-1;
for (Source source : sources) {
k++;
//авторизация
if (null != source.getUser
Authenticator.setDefault(new MyAuthenticator(source.getUser source.getPassword;
p=-1;
//считывание и заполнение
for (String url : source.getUrls{
try{
p++;

i[k][p]=ImageIO.read(new URL(url.getScaledInstance(this.getWidth this.getHeight / source.getUrls.length, 3);
}

catch(IOException e){return;}
}
}
//вывод картинок по очереди, картинки с одного сайта выводятся вместе на странице
for (a=0;a<sources.length;a++){

m=1;
repaint;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
return;
}
}

//host = source.getHost;


}

}




public void paint(Graphics g) {
// вызов из цикла
if (l==0){
if(m==1){

int u=0;

for(Image n : i[a]){
g.drawImage(n, 0, this.getHeight*u / i[a].length, null);
u++;
}
}
}



//вызов по нажатию мыши, при этом идет показ предыдущей картинки, еще не доделал,
if (l==1){

l=0;
/*if (a<0) {
int u=0;
for(Image n : i[sources.length-2]){
g.drawImage(n, 0, this.getHeight*u / i[sources.length-2].length, null);
u++;
}
a=sources.length-3;
return;
}*/

if(a==0){

int u=0;

for(Image n : i[sources.length-1]){
g.drawImage(n, 0, this.getHeight*u / i[sources.length-1].length, null);
u++;
}

--a;}

if (a>0) {
int u=0;

for(Image n : i[a-1]){
g.drawImage(n, 0, this.getHeight*u / i[a-1].length, null);

u++;
}
a=a-1;
}



}

}





static class MyAuthenticator extends Authenticator {
private String username, password;

MyAuthenticator(String user, String pass) {
username = user;
password = pass;
}

protected PasswordAuthentication getPasswordAuthentication {
return new PasswordAuthentication(username, password.toCharArray;}
}

public static void main(String[] arg) {
Test frame= new Test(new Source(new String[]{"1.jpg","2.jpg"},
"name", "pass", "host" new Source(new String[]{"3.jpg"},
"name", "pass", "host2"
new Source(new String[]{"4.jpg"},
"name", "pass", "host3";

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);



frame.setUndecorated(true);

GraphicsEnvironment.getLocalGraphicsEnvironment.getDefaultScreenDevice.setFullScreenWindow(frame);

frame.setVisible(true);
frame.process;

}
}

kill-still

ЧЯДНТ
все

serega1604

если сам не умеешь, то хоть не надо других учить гадостям.

tucha96

проблема что код отформатирован хуево

tucha96

теперь отформатирован ок и вроде есть подвижки
Оставить комментарий
Имя или ник:
Комментарий: