O parent component deve também ter um tamanho para o label correr, pois o parent funciona como clipping, por isso quando o label se posiciona fora do parent, ele some.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Tela extends JFrame {
JLabel label;
Thread thread;
int direcao;
boolean running;
public Tela() {
super();
label = new JLabel("Teste");
label.setOpaque(true);
label.setBackground(Color.BLUE);
label.setForeground(Color.WHITE);
label.setSize(50,30);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setPreferredSize(new Dimension(300,300));
panel.add(label);
label.setLocation(0,100);
direcao = 10;
getContentPane().add(panel);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thread = new Thread() {
public void run(){
while (running){
try {
Thread.sleep(100);
move(); // <-------------------------- Aqui
} catch (InterruptedException ex) {
//Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};
running = true;
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
running = false;
}
});
}
public void move(){
Point onde = this.label.getLocation(); //Atributo da classe pra armazenar a posição atual
// vai e volta
if (onde.x+direcao > 250) { // panel.width - label.width
direcao = -10;
} else if (onde.x+direcao < 0) {
direcao = 10;
}
this.label.setLocation(onde.x+direcao,onde.y); //Anda "1" pra direita
// this.coordX.setText(""+this.onde.x); //Exibe a posição pro usuário
}
public void iniciarThread() {
thread.start();
}
public static void main(String[] args) {
Tela tela = new Tela();
tela.setVisible(true);
tela.iniciarThread();
}
}
Fazer um component se mover não é fácil, tem varias formas de fazer isso e depende muito do modo que vc está fazendo o seu projeto.
Acredito que a forma mais simples está descrita acima, mas tem vários problemas de se fazer dessa forma.
Isso acontece porque o LayoutManager tem a responsabilidade de posicionar os components, quando o layout é null, não existe um layout posicionando os components, permitindo usar o setLocation