Вопрос по thread-sleep, event-dispatch-thread, java, swing, concurrency – Ваша проблема в том, что вы делаете что-то трудоемкое в обратном вызове ActionPerformed, который выполняется в потоке событий. В обратных вызовах вы должны сделать что-то быстро и вернуться, даже если это «что-то» порождает поток. Графический интерфейс не может обновляться, пока вы занимаетесь потоком событий, он будет обновляться только после возврата вашего обратного вызова.

2
   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  int count = jSlider1.getValue(); 
  int delay = jSlider2.getValue();
    int valueOfSlider = jSlider2.getValue();
     int valueOfSlider2 = jSlider1.getValue();

while (count > 0) 
{ 
    count--;
    String count2 = ""+count; 
  jLabel3.setText(count2);
try {Thread.sleep(delay); }
catch (InterruptedException ie) { }

 }

ечном итоге он покажет окончательное число на jLabel, но не будет постепенно обновлять номер. любая помощь

Ваш Ответ

2   ответа
4

что вы делаете что-то трудоемкое в обратном вызове ActionPerformed, который выполняется в потоке событий. В обратных вызовах вы должны сделать что-то быстро и вернуться, даже если это «что-то» порождает поток. Графический интерфейс не может обновляться, пока вы занимаетесь потоком событий, он будет обновляться только после возврата вашего обратного вызова.

9

Качели однопоточные, Следовательно,долгосрочные задачи никогда не должны проходить в EDT, Это включает в себя сон. Вместо этого используйтеjavax.swing.Timer, Это задержит фоновый поток, а затем опубликует действие, которое будет выполнено в EDT.

Смотрите также:

Как использовать Swing Timers
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public final class JLabelUpdateDemo {

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame("Update JLabel Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(JTimerLabel.getInstance());
        frame.setSize(new Dimension(275, 75)); // used for demonstration purposes
        //frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        Timer t = new Timer(1000, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                int val = Integer.valueOf(JTimerLabel.getInstance().getText());
                JTimerLabel.getInstance().setText(String.valueOf(++val));
            }
        });
        t.start();
    }

    private static final class JTimerLabel extends JLabel{
        private static JTimerLabel INSTANCE;

        private JTimerLabel(){
            super(String.valueOf(0));
            setFont(new Font("Courier New", Font.BOLD,  18));
        }

        public static final JTimerLabel getInstance(){
            if(INSTANCE == null){
                INSTANCE = new JTimerLabel();
            }

            return INSTANCE;
        }
    }
}

ЭтотSSCCE имитирует счетчик, который будет отсчитывать от0 каждую секунду (т.е. обновлятьJLabel экземпляр), пока приложение не будет прекращено.

+1, для Таймера как простого решения. @Maxwell, EDT расшифровывается как Thread Dispatch Thread. Прочитайте раздел из учебника по Swing насовпадение для дополнительной информации. camickr

Похожие вопросы