Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > ПАУЗА, задержка


Автор: hagerds 9.1.2012, 21:54
пытаюсь заставить JLabel менять своё название каждую секунду
пример:
ggg :3
ggg :2
ggg :1

помогите подправить код.
Код

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

public class test7 {

    public static void main(String[] args) throws InterruptedException {
        jFrame frame=new jFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
class jFrame extends JFrame
{
    public jFrame() 
    {
        label=new JLabel(str);
        
        JPanel panel=new JPanel();
        panel.setLayout(new GridLayout(2,0));
        
        JButton button=new JButton("start");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                try {
                    for(int i=3;i>0;i--)
                    {
                        System.out.println(str+i);
                        label.setText(str+i);
                        Thread.sleep(1000);
                        }
                    } catch (InterruptedException e) {e.printStackTrace();}
            }});
        
        panel.add(label);
        panel.add(button);
        this.getContentPane().add(panel);
        pack();
    }
    private JLabel label;
    private String str="ggg :";
}

Автор: Dummy 9.1.2012, 22:49
Thread.sleep() в Event Dispatch Thread низя, ибо EDT един для Swing, а значит, мы подвесим UI нашего приложения целиком. Поэтому пользуемся javax.swing.Timer:

Код

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        TimerFrame frame = new TimerFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class TimerFrame extends JFrame implements ActionListener {
    private int numUpdated;
    private JLabel label;
    private Timer  updateTimer;
    
    TimerFrame() {
        label = new JLabel("ggg:");

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 0));

        JButton button = new JButton("start");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                startUpdates();
            }
        });

        panel.add(label);
        panel.add(button);
        this.getContentPane().add(panel);
        pack();
    }
    
    private void startUpdates() {
        updateTimer = new Timer(1000, this);
        updateTimer.start();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        numUpdated++;

        label.setText("ggg: " + numUpdated);
        
        if (numUpdated == 3) {
            updateTimer.stop();
        }
    }
}

Автор: hagerds 10.1.2012, 00:56
Спасибо большое за помощь smile  smile  smile 

В коде разобрался, а вот с теорией не очень понял. 
1)Dummy можешь ещё раз по подробнее объяснить почему Thread нельзя  и почему пользуемся Timer? smile 
2)InterruptedException - обязательно нужна и почему?

3)немного поспешил радоваться =). Можно ли заблокировать приложение на 3 секунды,как при Thread.sleep, но при этом JLabel отображал бы изменения.1,2,3 или 3,2,1?

пример: по нажатию на start. JLabel изменяется 1,2,3 и после 3 секунд выводится "привет!!!"

Код

...
button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                startUpdates();
                System.out.println("привет!!!");
            }
        });
...

Автор: aleksandy 10.1.2012, 08:49
Цитата(hagerds @  10.1.2012,  00:56 Найти цитируемый пост)
В коде разобрался, а вот с теорией не очень понял. 

http://www.skipy.ru/technics/gui_sync.html и http://www.skipy.ru/technics/gui_int.html.

Автор: Mirkes 10.1.2012, 16:31
Эта задача разбиралась на форуме неоднократно. Наиболее полное обсуждение http://forum.vingrad.ru/index.php?showtopic=336603&view=findpost&p=2391581

Автор: hagerds 20.5.2012, 12:30
Всем спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)