Problemas com componentes swing

Bom, meu codigo esta funfando:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class MainScreen extends JFrame{

	JPanel panel;
	JFrame loginFrame;
	JLabel lblTitle02, lblUser, lblPassword;
	JButton btEntrar;
	JTextField tfUser;
	JPasswordField tfPassword;;
	
	MainScreen(){
		
		loginFrame = new JFrame();
		panel = new JPanel();
		Font titulo01 = new Font("Serif",Font.BOLD, 20);
		
		loginFrame.setTitle("LOCADORA DE VEICULOS");
		loginFrame.setLocation(300, 300);
		loginFrame.setVisible(true);
		loginFrame.setSize(430, 370);
		
		loginFrame.getContentPane().add(panel);
		panel.setLayout(null);
		
		lblTitle02 = new JLabel("LOGIN");
		lblTitle02.setVisible(true);
		lblTitle02.setFont(titulo01);
		lblTitle02.setBounds(20, 135, 280, 80);
		
		
		lblUser = new JLabel("Usuario:  ");
		lblUser.setBounds(20, 215, 200, 35);
		
		lblPassword = new JLabel("Senha:  ");
		lblPassword.setBounds(20, 245, 200, 35);
		
		tfUser = new JTextField(10);
		tfUser.setBounds(75, 220, 100, 20);
		
		tfPassword = new JPasswordField(10);
		tfPassword.setBounds(75, 255, 100, 20);
		
		btEntrar = new JButton("Entrar");
		btEntrar.setBounds(75, 290, 70, 20);
		btEntrar.setToolTipText("Clique aqui para entrar!");
		btEntrar.addActionListener(new ActionListener() {
        		
		panel.add(lblUser);
		panel.add(lblPassword);
		panel.add(tfUser);
		panel.add(tfPassword);
		panel.add(btEntrar);
	}
}

Bom eu to no eclipse e coloco a aplicacao para rodar, as vezes ela sobe, com todos os componentes na tela, mais tem vezes que só carrega a janela sem nenhum componente. Se eu minimizar e restaurar a janela os componente aparecem.

Alguem sabe oque pode ser? :?

Muda esse linha loginFrame.setVisible(true); para última instrução do construtor, ou seja, primeiro você define os componetes na tela e por último seta a visibilidade da janela. Tive um problema assim há muito tempo e resolvi dessa maneira.

1 curtida

não é isso nao.

A janela aparece certinho mais sem nenhum componente(label,textfield,button), se eu minimizar e restaurar ela ae tds componentes aparecem

:shock:

[quote=Renan4000]não é isso nao.

A janela aparece certinho mais sem nenhum componente(label,textfield,button), se eu minimizar e restaurar ela ae tds componentes aparecem

:shock: [/quote]

Tentou fazer isso amigo? Aconteceu a mesma coisa?

Abraços

frame.setVisible(true);

tentei sim, da na mesma, como eu ja disse o frame aparece sem os componentes. Quando eu minimizo e restauro a tela eles aparecem! :frowning:

Eu executei o seu código e consegui reproduzir o problema. Depois de algumas alterações, creio que consegui resolver o problema. Dentre alguns fatores que podiam causá-lo, como o setVisible() que o pessoal comentou anteriormente, também havia o fato de o frame não ter recebido um layout. O código alterado está a seguir:

public class MainScreen extends JFrame {

JPanel panel;
JFrame loginFrame;
JLabel lblTitle02, lblUser, lblPassword;
JButton btEntrar;
JTextField tfUser;
JPasswordField tfPassword;;

MainScreen() {
    Font titulo01 = new Font("Serif", Font.BOLD, 20);

    lblTitle02 = new JLabel("LOGIN");
    lblTitle02.setFont(titulo01);
    lblTitle02.setBounds(20, 135, 280, 80);

    lblUser = new JLabel("Usuario:  ");
    lblUser.setBounds(20, 215, 200, 35);

    lblPassword = new JLabel("Senha:  ");
    lblPassword.setBounds(20, 245, 200, 35);

    tfUser = new JTextField(10);
    tfUser.setBounds(75, 220, 100, 20);

    tfPassword = new JPasswordField(10);
    tfPassword.setBounds(75, 255, 100, 20);

    btEntrar = new JButton("Entrar");
    btEntrar.setBounds(75, 290, 70, 20);
    btEntrar.setToolTipText("Clique aqui para entrar!");

    panel = new JPanel();
    panel.setLayout(null);
    panel.setPreferredSize(new Dimension(430, 370));

    panel.add(lblUser);
    panel.add(lblPassword);
    panel.add(tfUser);
    panel.add(tfPassword);
    panel.add(btEntrar);

    loginFrame = new JFrame();
    loginFrame.setLayout(new GridLayout());
    loginFrame.setTitle("LOCADORA DE VEICULOS");
    loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    loginFrame.add(panel);
    loginFrame.pack();
    loginFrame.setLocationRelativeTo(null);
    loginFrame.setVisible(true);
}

Ok, Wellington! Na próxima vez utilizarei o botão “Code”. Obrigado pela informação!

O loginFrame.setVisible(true) deve ser a última linha do seu construtor.

Sempre que um frame ou JPanel (ou qualquer container) estiver visível, você é obrigado a chamar validate() para que um novo componente adicionado apareça. Note que isso está escrito na própria documentação do método add:

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Container.html#add(java.awt.Component,%20java.lang.Object,%20int)

Por isso, deixe sempre para deixar o seu frame visível no último momento possível.
Uma dica. Facilita muito o desenvolvimento de aplicações Swing se o seu comando setVisible() não estiver no construtor de suas janelas. Sempre que possível, deixe o setVisible fora de lá e deixe a classe que dá new na janela chama-lo explicitamente.

Posso contar nos dedos quantas vezes um repaint foi necessário. Quase nunca é. Se você está tendo que usar esse comando, tem coisa errada no seu código.

era só colocar

frameLogin.setVisible(true);

na ultima linha do construtor mesmo, valeu ViniGodoy!!

Eii pessoal…alguém tem algum código-fonte completo de uma Locadora de veículos…ou a parte de swing??
Se puderem me ajudar…Agradeço! :smiley:

Tente:

pack(); loginFrame.setVisible(true);
Ao final do código

Olá nossoamigo, ao postar códigos, use a tag CODE (vide botão acima do editor da mensagem).
O fato de não possuir um layout não é o causador do problema citado.

Renan4000, editei meu post anterior testando seu código. Não consegui mais replicar o problema.
Coloque, sempre q possível, os setVisibles em ordem do mais interno para o mais externo e, em caso de alterações, usar revalidate (quando o objeto GUI for do tipo JComponent). As vezes, o repaint pode ser necessário.

Posso contar nos dedos quantas vezes um repaint foi necessário. Quase nunca é. Se você está tendo que usar esse comando, tem coisa errada no seu código.[/quote]
Em geral não é necessário mesmo.
Infelizmente estou num projeto que já estava lotado de repaints antecedidos pelos revalidates :?: …
E o tamanho dele impede uma revisão dessa situação (pelo menos por agora).