задержка перемещения графики в Java [дубликат]

Использование функции make.names () из встроенного базового пакета может помочь:

is_valid_name<- function(x)
{
  length_condition = if(getRversion() < "2.13.0") 256L else 10000L
  is_short_enough = nchar(x) <= length_condition
  is_valid_name = (make.names(x) == x)

  final_condition = is_short_enough && is_valid_name
  return(final_condition)
}
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 3 September 2018 в 15:04
поделиться

Хорошо, что вы удалили 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 3 September 2018 в 15:04
поделиться

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

2
ответ дан tskuzzy 3 September 2018 в 15:04
поделиться
Другие вопросы по тегам:

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