Subclasse de JWindow não aparece quando invocada pelo Listener

11 respostas
renzonuccitelli

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á.

11 Respostas

Marcio_Duran

renzonuccitelli:
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:

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á.

foram importados os pacotes adequadamente (Exemplo)

import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.ImageIcon; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent;

Não falta nada para JPanel implements ActionListener ?

implementação exemplo

import java.awt.*;
//Create a Draggable JWindow

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JWindowDemo extends JWindow
    {
    
     private int X=0;
     private int Y=0;
    
     public JWindowDemo(){
        
         setBounds(60,60,100,100);
        
         addWindowListener(new WindowAdapter(){
             public void windowClosing(WindowEvent e){
                 System.exit(0);	//An Exit Listener
             }
         });
        
         //Print (X,Y) coordinates on Mouse Click
         addMouseListener(new MouseAdapter() {
             public void mousePressed(MouseEvent e){
                 X=e.getX();
                 Y=e.getY();
                 System.out.println("The (X,Y) coordinate of window is ("+X+","+Y+")");
             }
         });
        
         addMouseMotionListener(new MouseMotionAdapter()
             {
             public void mouseDragged(MouseEvent e){
                 setLocation(getLocation().x+(e.getX()-X),getLocation().y+(e.getY()-Y));
             }
         });
        
         setVisible(true);
     }
     public static void main(String[] args){
         new JWindowDemo();
     }
}
renzonuccitelli

Sim, até porque uso o Eclipse, que faz a import de forma automática. Além disso, ele me indicaria erro. Se vc rodar o teste contendo as classes, vai ver que roda direito. Coloquei uns prints para verificar se o Listener realmente estava executando tudo, e ele está. Não é lançada nenhuma Exceção.

Marcio_Duran

Coloquei exemplo, veja se falta algo para invocação de alguma instância ???

renzonuccitelli

Se vc reparar nas linhas 11 a até o final da minha classe teste vai reparar que ali está o mesmo código que é executado no meu Listener. Por isso, se tivesse algum problema, ele ocorreria também nessa parte do código, o que não ocorre. Isso que estou achando estranho, o mesmo trecho de código funcionar na main e não no Listener. Isso pq eu printei a chamada da barra de progresso, sua construção e seu término, e ambas execução mostram a mesma saída. Enfim, não encontro qual o problema. Acho que se for pra alguém entender bem o que está ocorrendo, vai ter que rodar o meu exemplo.

Editado: mas valeu pela força.

Marcio_Duran

renzonuccitelli:
Se vc reparar nas linhas 11 a até o final da minha classe teste vai reparar que ali está o mesmo código que é executado no meu Listener. Por isso, se tivesse algum problema, ele ocorreria também nessa parte do código, o que não ocorre. Isso que estou achando estranho, o mesmo trecho de código funcionar na main e não no Listener. Isso pq eu printei a chamada da barra de progresso, sua construção e seu término, e ambas execução mostram a mesma saída. Enfim, não encontro qual o problema. Acho que se for pra alguém entender bem o que está ocorrendo, vai ter que rodar o meu exemplo.

Editado: mas valeu pela força.

Pode colocar todas as linhas do seu código de uma vez só , e sem o parâmetro Code aqui do GUJ, para que eu possa copiar no Eclipse e entender esse erro melhor…

renzonuccitelli

Se vc clicar no botão View Plain aqui do GUJ, ele apresenta o código sem formatação pra vc poder copiar. O Botão fica em cima de qualquer código postados com a tag code.

renzonuccitelli

Para ficar mais claro que o código é o mesmo, fiz algumas alterações no Listener e no 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);
		testar(frame);
	}
	
	public static void testar(Updatable u){
		u.setWaitingResponse("testanto");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		u.receiveValidationResult(new ValidationResult());
	}

}
public class Action implements ActionListener {
	private Updatable updatable;
	
	public Action(Updatable updatable) {
		super();
		this.updatable = updatable;
	}

	public void actionPerformed(ActionEvent e) {
		UpdatableFrameTest.testar(updatable);
		
//		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());
	}

}

Ou seja, agora o teste e o listener estão realmente executando o mesmo método. Contudo, no teste o JWindow aparece e no Listener não. Alguém se habilita?

renzonuccitelli

Ninguém?

renzonuccitelli

Fala pessoal, eu percebi que com o código que postei nao vai dar pra rodarem o exemplo sem um jar específico. Então simplifiquei o exemplo:

public interface Updatable2 {
   
    public void receiveValidationResult(String validationMessage);
    public void setWaitingResponse(String message);
}


public class UpdatableFrame extends JFrame implements Updatable2 {
    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 void receiveValidationResult(String m) {
        if(mostradorDeProgresso!=null){
        mostradorDeProgresso.dispose();
        this.mostradorDeProgresso=null;
        }
        System.out.println("Fechando mensagem de Espera");

    }

    @Override
    public void setWaitingResponse(String message) {
        System.out.println("Setando mensagem de espera");
        if(mostradorDeProgresso==null)
        mostradorDeProgresso= new MostradorDeProgresso(message);
        mostradorDeProgresso.setVisible(true);

    }
}


public class UpdatableFrameTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        UpdatableFrame frame=new UpdatableFrame();
        frame.setSize(100, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        testar(frame);
//        testar(frame);
    }
   
    public static void testar(Updatable2 u){
        u.setWaitingResponse("testanto");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        u.receiveValidationResult("");
    }

}


public Action(Updatable2 updatable) {
        super();
        this.updatable = updatable;
    }

    public void actionPerformed(ActionEvent e) {
        UpdatableFrameTest.testar(updatable);
       
    }

}


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.setContentPane(progressBar);
		this.setSize(200, 20);
		this.setLocationRelativeTo(null);
		this.setAlwaysOnTop(true);
		System.out.println("Construiu todo progresso");
	}
//	@Override
//	public void setVisible(boolean flag){
//		super.setVisible(flag);
//		if(flag){
//			progressBar=new JProgressBar();
//			progressBar.setStringPainted(true);
//			progressBar.setIndeterminate(true);
//			this.validate();
//		}
//	}
	
	public MostradorDeProgresso(String title){
		this(title,true);
	}

	public void setMessagem(String message) {
		progressBar.setString(message);
		
	}
	
	
}

reparem que o método teste é chamado pela main e pelo Listener. Quando chamada pela main, o JWindou é mostrado, quando chamado pelo Listener nao. Engraçado que cheguei a trocar a superclasse do MostradorDeProgresso para JDiallog. Aí ele mostra a caixa de diálogo quando chamado pela main, e mostra a caixa sem a progressBar quando chamado pelo Listener. Realmente não sei mais o que fazer.

renzonuccitelli

Ninguém sabe o que está acontecendo?

renzonuccitelli

Vou dizer: esse é o primeiro tópico que vejo ficar sem resposta aqui no GUJ, o problema deve ser sério mesmo…

Criado 10 de janeiro de 2009
Ultima resposta 13 de jan. de 2009
Respostas 11
Participantes 2