Ola pessoal do GUJ.
Estou quebrando a cabeça tem um tempão e não sei o que está errado.
Criei um componente para mostrar uma mensagem de espera. Segue o código da mesma:
public class MostradorDeProgresso extends JWindow {
private JProgressBar progressBar;
public MostradorDeProgresso(String title,boolean enableRootPane) throws HeadlessException {
super();
progressBar=new JProgressBar();
progressBar.setString(title);
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
this.getContentPane().add(progressBar,BorderLayout.CENTER);
this.setSize(200, 20);
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
System.out.println("Construiu todo progresso");
}
public MostradorDeProgresso(String title){
this(title,true);
}
também criei uma interface para que as UI respondam para eventos:
public interface Updatable {
public void setUIId(long id);
public long getUIId();
public void receiveUpdateResponse(Response response);
public void receiveDeleteResponse(Response response);
public void receiveSaveResponse(Response response);
public void receiveValidationResult(ValidationResult validationResult);
public Request createRequest();
public void setWaitingResponse(String message);
}
Aí criei um Listener para testar:
public class Action implements ActionListener {
private Updatable updatable;
public Action(Updatable updatable) {
super();
this.updatable = updatable;
}
public void actionPerformed(ActionEvent e) {
System.out.println("Executando ação");
this.updatable.setWaitingResponse("Testando");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
updatable.receiveValidationResult(new ValidationResult());
}
}
Entao criei minha UI extendendo a interface e adicionando um botao com a acao:
public class UpdatableFrame extends JFrame implements Updatable {
private MostradorDeProgresso mostradorDeProgresso;
protected UpdatableFrame() throws HeadlessException {
super();
JButton botao=new JButton("Mostrar");
botao.addActionListener(new Action(this));
this.getContentPane().add(botao,BorderLayout.SOUTH);
}
@Override
public Request createRequest() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getUIId() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void receiveDeleteResponse(Response response) {
// TODO Auto-generated method stub
}
@Override
public void receiveSaveResponse(Response response) {
// TODO Auto-generated method stub
}
@Override
public void receiveUpdateResponse(Response response) {
// TODO Auto-generated method stub
}
@Override
public void receiveValidationResult(ValidationResult validationResult) {
mostradorDeProgresso.dispose();
}
@Override
public void setUIId(long id) {
// TODO Auto-generated method stub
}
@Override
public void setWaitingResponse(String message) {
mostradorDeProgresso= new MostradorDeProgresso(message);
mostradorDeProgresso.setVisible(true);
}
O problema é que o JWindow não é mostrado quando clico no botão. Para conferir o que estava ocorrendo de errado, criei um teste:
public class UpdatableFrameTest {
/**
* @param args
*/
public static void main(String[] args) {
UpdatableFrame frame=new UpdatableFrame();
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Updatable u=frame;
u.setWaitingResponse("testanto");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
u.receiveValidationResult(new ValidationResult());
}
}
O engraçado é que da linha Updatable u=frame; para baixo, o código executado é o mesmo do Listener, e esse código executado pela Main funciona perfeitamente, já o do Listener não.
Alguém poderia me ajudar?
Obrigado desde já.