Почти ничего! Вы можете использовать «assign» для создания смешных имен переменных:
assign("1",99)
ls()
# [1] "1"
Да, это переменная с именем «1». Цифра 1. К счастью, это не меняет значение целого числа 1, и вам нужно немного усердно работать, чтобы получить его значение:
1
# [1] 1
get("1")
# [1] 99
. Синтаксические ограничения, о которых могут упомянуть некоторые люди, парсер. По сути, очень мало вы не можете назвать R-объектом. Вы просто не можете сделать это с помощью оператора присваивания «& lt; -». «get» освободит вас:)
Вот пример использования 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();
}
}
}
Хорошо, что вы удалили 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 );
}
}
Вы хотите использовать Timer , если хотите указать задержку для действия.