Добавление задержки при изменении элементов GUI [дубликат]

Почти ничего! Вы можете использовать «assign» для создания смешных имен переменных:

assign("1",99)
ls()
# [1] "1"

Да, это переменная с именем «1». Цифра 1. К счастью, это не меняет значение целого числа 1, и вам нужно немного усердно работать, чтобы получить его значение:

1
# [1] 1
get("1")
# [1] 99

. Синтаксические ограничения, о которых могут упомянуть некоторые люди, парсер. По сути, очень мало вы не можете назвать R-объектом. Вы просто не можете сделать это с помощью оператора присваивания «& lt; -». «get» освободит вас:)

2
задан cspolton 7 October 2012 в 09:51
поделиться

3 ответа

Вот пример использования javax.swing.Timer

public class TestBlinkingText {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BlinkPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }            
        });
    }

    protected static class BlinkPane extends JLabel {

        private JLabel label;
        private boolean state;

        public BlinkPane() {

            label = new JLabel("Look at me!");
            setLayout(new GridBagLayout());

            add(label);

            Timer timer = new Timer(500, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent ae) {                    
                    state = !state;
                    if (state) {
                        label.setForeground(Color.RED);
                    } else {
                        label.setForeground(Color.BLACK);
                    }                    
                    repaint();                    
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.setInitialDelay(0);
            timer.start();            
        }        
    }    
}
5
ответ дан MadProgrammer 24 August 2018 в 17:47
поделиться

Хорошо, что вы удалили Thread.sleep, так как ваш пользовательский интерфейс не реагирует на эти 2 секунды.

Что вы можете сделать, это запустить Timer, который запускается только один раз:

int delay = 2000;
Timer timer = new Timer( delay, new ActionListener(){
  @Override
  public void actionPerformed( ActionEvent e ){
    jLabel12.setForeground( Color.red );
  }
} );
timer.setRepeats( false );
timer.start();

Обратите внимание, что Timer является javax.swing.Timer, что гарантирует, что метод actionPerformed для ActionListener вызывается в потоке отправки событий, соблюдая правила потоковой передачи Swing.

Это также возможно с помощью SwingWorker, но для этого я буду придерживаться Timer. Если вы хотите использовать SwingWorker, вы можете просто использовать Thread.sleep в методе doInBackground() и обновить JLabel в методе done().

Что-то в строках

class Delay extends SwingWorker<Void, Object> {
 @Override
 public void doInBackground() {
  Thread.sleep( 2000 );
 }

 @Override
 protected void done() {
   jLabel12.setForeground( Color.red );
 }
}
4
ответ дан Robin 24 August 2018 в 17:47
поделиться

Вы хотите использовать Timer , если хотите указать задержку для действия.

2
ответ дан tskuzzy 24 August 2018 в 17:47
поделиться
Другие вопросы по тегам:

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