Duvida sobre Swing

7 respostas
T

Bem pessoal, minha duvida nem é referente ao codigo mas sim o porque acontece o que acontece rsrs

nao funciona corretamente:
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JButton;

class TesteFrame extends JFrame {

   private JLabel label;
   private JTextField tf;
   private JButton botao;
   
   public TesteFrame(){
      super("Titulo");
	  setLayout( new FlowLayout());
	  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	  setSize(500,300);
	  setVisible(true);
	  
	  label = new JLabel("Texto do label");
	  add(label);
	  
	  tf = new JTextField(20);
	  add(tf);
	  
	  botao = new JButton("Clique aqui");
	  add(botao);
   }
}
class ExecFrame {
   public static void main(String args[]){
      TesteFrame tf = new TesteFrame();
   }
}
funciona corretamente:
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JButton;

class TesteFrame extends JFrame {

   private JLabel label;
   private JTextField tf;
   private JButton botao;
   
   public TesteFrame(){
      super("Titulo");
	  setLayout( new FlowLayout());
	  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	  
	  setVisible(true);
	  
	  label = new JLabel("Texto do label");
	  add(label);
	  
	  tf = new JTextField(20);
	  add(tf);
	  
	  botao = new JButton("Clique aqui");
	  add(botao);
   }
}
class ExecFrame {
   public static void main(String args[]){
      TesteFrame tf = new TesteFrame();
	  tf.setSize(500,300);
   }
}

Porque no primeiro caso o botao, textfield e label so aparecem depois que eu redimensionar manualmente o tamanho da janela e no segundo caso funciona certinho.

Quando eu escrevo:

setSize(500,300);

Nao é o mesmo que criar um objeto da classe e setar o tamanho?

Abraços

7 Respostas

gqferreira

Bem pessoal, minha duvida nem é referente ao codigo mas sim o porque acontece o que acontece rsrs

nao funciona corretamente:
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JButton;

class TesteFrame extends JFrame {

private JLabel label;
private JTextField tf;
private JButton botao;

public TesteFrame(){
super("Titulo");
setLayout( new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,300);
setVisible(true);

label = new JLabel("Texto do label");
add(label);

tf = new JTextField(20);
add(tf);

botao = new JButton("Clique aqui");
add(botao);
}
}
class ExecFrame {
public static void main(String args[]){
TesteFrame tf = new TesteFrame();
}
}
funciona corretamente:
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JButton;

class TesteFrame extends JFrame {

private JLabel label;
private JTextField tf;
private JButton botao;

public TesteFrame(){
super("Titulo");
setLayout( new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

label = new JLabel("Texto do label");
add(label);

tf = new JTextField(20);
add(tf);

botao = new JButton("Clique aqui");
add(botao);
}
}
class ExecFrame {
public static void main(String args[]){
TesteFrame tf = new TesteFrame();
tf.setSize(500,300);
}
}
Porque no primeiro caso o botao, textfield e label so aparecem depois que eu redimensionar manualmente o tamanho da janela e no segundo caso funciona certinho. Quando eu escrevo:
setSize(500,300);

Nao é o mesmo que criar um objeto da classe e setar o tamanho?

Abraços

Gustavo:
Acho que assim fica melhor...^^
gqferreira

Aqui funcionou perfeito das duas maneiras... Você está usando qual sistema operacional?

Uma dica.... não sei se pode ser o problema... Dê o setVisible no objeto, prefiro fazer assim....

package remessa;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JButton;

class TesteFrame extends JFrame {

	private JLabel label;
	private JTextField tf;
	private JButton botao;

	public TesteFrame(){
		super("Titulo");
		setLayout( new FlowLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,300);
		
		label = new JLabel("Texto do label");
		add(label);

		tf = new JTextField(20);
		add(tf);

		botao = new JButton("Clique aqui");
		add(botao);
	}
}
package remessa;
class ExecFrame {
	public static void main(String args[]){
		TesteFrame tf = new TesteFrame();
		tf.setVisible(true); 
	}
}
T

Cara, creio que nao seja do sistema operacional e sim da versao do jdk se for este o caso.

Uso windows xp

Sobre o codigo no topico, desculpe. Fiz mo confusao aqui.

Sobre dar o setVisible, nem testei isso. Mas no segundo caso ja funcionou corretamente. Eu apenas queria ver se alguem sabe se esse erro é na minha maquina mesmo ou o motivo que esta causando o erro…

Abraços

R

Tecno-Java: Na primeira listagem de código que você mostrou, você exibe o formulário (setVisible(true)) e em seguida adiciona alguns componentes. Esses componentes só serão exibidos quando o formulário tiver de ser redesenhado - por exemplo, após um redimensionamento do formulário.

Na segunda listagem tudo funciona bem porque, após a chamada do construtor, você chama setSize() no método main(), o que força o redimensionamento e portanto o redesenho do formulário.

As regras práticas para casos como esse são: só chame setVisible(true) depois de que tiver seu formulário completamente montado; NÃO faça com que um formulário exiba a si mesmo dentro do próprio construtor dele; e, se tiver que adicionar componentes a um formulário em tempo de execução, chame repaint() após a adição para que o formulário seja redesenhado adequadamente.

Marky.Vasconcelos

Depois de adicionar falta um pack()

ViniGodoy

Diz o javadoc do método add da classe Container:

“Javadoc do add classe container”:

Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.

Traduzindo:

“Se um componente foi adicionado a um container que já foi exibido, o método validate() deve ser chamado nesse container para que o novo componente seja exibido. Caso multiplos componentes tenham sido adicionados, você pode melhorar a eficiência chamando validate apenas uma vez, depois que todos os componentes tenham sido adicionados.”

T

Cara, valeu pela dica :slight_smile:

Abraços

Criado 20 de julho de 2009
Ultima resposta 28 de jul. de 2009
Respostas 7
Participantes 5