[Java] Работа update()
Могу ошибаться, но вроде сама отрисовка происходит в другом потоке. То есть, ты 3 раза просишь перерисовать, а когда оно по факту рисует, там уже 3.
repaint ничего не рисует, он лишь ставит сообщение о том, что изображение должно быть перерисовано.
сама же перерисовка происходит только после того, как функция (в которой цикл) закончится, и отдаст управление циклу сообщений
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
return;
}
то все норм, отображает как задумано ( 0,1,2 причем если поставить этот блок перед repaint в цикле,то цифра 3 все-таки будет выведена (0,1,2,3).
сама же перерисовка происходит только после того, как функция (в которой цикл) закончится, и отдаст управление циклу сообщенийДля этого сам цикл должен происходить в AWTEventDispatcher или как его там зовут.
Судя по написанному позже, это не так.
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);
}
}
тогда почему,когда я вставляю в цикле после repaint задержку а-лятогда значит все-таки repaint вызывает paint (а не просто ставит сообщение но перерисовка происходит так быстро, что ты успеваешь увидеть только последний кадр
тогда значит все-таки repaint вызывает paint (а не просто ставит сообщение но перерисовка происходит так быстро, что ты успеваешь увидеть только последний кадрвыше написал всё абсолютно правильно:
paint вызывается в EDT, а repaint лишь отправляет запрос на вызов paint. Соответственно, если цикл топикстартера отрабатывал в EDT, то да, фактически paint может вызваться только после выхода из цикла. Но если не в EDT, то отправляется серия асинхронных запросов на перерисовку, а java из соображений оптимизации имеет право объединить несколько запросов на перерисовку в один (конкретный алгоритм объединения зависит от реализации). Думаю, как раз такое объединение и происходило у топикстартера.
ЗЫ:
Но вообще, конечно, странно желать увидеть весь отсчёт и не поставить задержку между перерисовками - это ж, в любом случае, невозможно было бы увидеть
только не объединить, а просто выкинуть из очереди все дублирующие мессаги.
Но вообще repaint рекомендуется вызывать с указанием области перерисовки, и тогда java может именно объединить эти области в одну и обновить её за один раз.
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, спасибо за пояснение, тупанул я.
ты знаешь, что такое поток и замыкание? зачем ты их удалил?
посмотри пример в Color fading animation - может так тебе понятнее будет.
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;
}
}
ЧЯДНТвсе
если сам не умеешь, то хоть не надо других учить гадостям.
проблема что код отформатирован хуево
теперь отформатирован ок и вроде есть подвижки
Оставить комментарий
SergeRRRRRR
есть цикл, например такойпроблема в том, что выводится только числа 0 и 3. 0 - из-за первичной прорисовки, 3 видимо после того, как цикл отработал. Я ожидал вывод 0,0,1,2. В чем фишка? Я так понимаю, что-то с потоком..но хз точно. Сильно не бейте, только начал изучать java.