Problema com JFrame;

5 respostas
F

Estou com um problema;
Tenho um JFrame e na minha concepção esta tudo ok;
porem qnd eu executo a janela os componetes nao apareçem; sim esta tudo adicionado e visivel;
o estranho é que qundo eu redimensino o janela ou aperto dentro dela aleatoriamente os componentes apareçem;

eis o source code
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tcm_sistematreinamento;

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

/**
 *
 * @author Fernando
 */
public class TelaReservaSala extends JFrame {
    JPanel painel;
    
    JButton reservar;
    JLabel sala , horarioDas, horarioAs,capacidadeSalaL, dataInicio, DataTermino;
    JTextField capacidadeSalaTF, dataInicioTF,dataTerminoTF;
    JComboBox salasCombo, horarioLista;
    JTable listaSalasTable;
     
    public TelaReservaSala(){
        
        painel = new JPanel();
        JFrame TelaReservaSala = new JFrame("Reserva de Sala");
        setContentPane(painel);
        
        setSize(700,500);
        setLocation(375,100);
        setVisible(true);
        setResizable(false);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
                                                          //BOTÃO
        reservar = new JButton("Reservar");
        reservar.setBounds(100,350,70,20);
        
                                                          //JLabel                  
        sala = new JLabel("Sala:");
        sala.setBounds(5,80,60,20);
        
        horarioDas = new JLabel("Hoarario Das:");
        horarioDas.setBounds(300,80,120,20);
        
        horarioAs = new JLabel(" As:");
        horarioAs.setBounds(450,100,50,20);
        
        capacidadeSalaL = new JLabel("Capacidade Da Sala:");
        capacidadeSalaL.setBounds(5,120,150,20);
        
        dataInicio = new JLabel("Data de Termino");
        dataInicio.setBounds(5,140,100,20);
                                                           
        capacidadeSalaTF = new JTextField();        //JTextField 
        capacidadeSalaTF.setBounds(160,120,120,20);
        capacidadeSalaTF.setEditable(false);
        
        dataInicioTF = new JTextField();
        dataInicioTF.setBounds(140,140,70,20);
        
        dataTerminoTF = new JTextField();
        dataTerminoTF.setBounds(140,160,70,20);
        
        
        String listaSalas[] = new String[]{"sala 1","Sala 2","Sala 3","Sala 4"};
        salasCombo = new JComboBox(listaSalas);
        salasCombo.setBounds(100,100,100,20);
        
        String listaHorarios[] = new String[]{"08:00 hs as 12:00 hs","12:30 hs as 16:30 hs","17:00 hs as 20:00 hs"};
        horarioLista = new JComboBox(listaHorarios);
        horarioLista.setBounds(300,80,120,20);
        
        listaSalasTable = new JTable();
        String colunas[] = new String[]{"Sala","Status","Horario 1","Horario 2","Horario 3"};
        listaSalasTable.setBounds(5,400,700,20);
        
               
               
        painel.add(sala);
        painel.add(reservar);
        painel.add(horarioDas);
        painel.add(horarioAs);
        painel.add(capacidadeSalaTF);
        painel.add(dataInicio);
        painel.add(capacidadeSalaTF);
        painel.add(capacidadeSalaL);
        painel.add(salasCombo);
        painel.add(horarioLista);
        painel.add(listaSalasTable);
               
        
    }
    public static void main (String x[]){
        new TelaReservaSala();
    }
}

qlqer ajuda é bem vinda

5 Respostas

ViniGodoy

Retire o comando setVisible(true) do seu construtor. Além de ser má prática, gera esse tipo de problema.
Solução:

  1. Apague a linha 31.
  2. Altere a inicialização para:
new TelaReservaSala().setVisible(true);
renamed

Coloque o setVisible(true) com ultimo comando no seu construtor

painel.add(horarioLista);
painel.add(listaSalasTable);
setVisible(true);
        
}

ou melhor ainda, tire esse comando do seu construtor e o coloque na main, assim

public static void main (String x[]){
        new TelaReservaSala().setVisible(true);
}
yhhik

toque isso de lugar:

setSize(700,500); setLocation(375,100); setVisible(true); setResizable(false);

coloque no final do seu código e veja o que acontece.

F

Valeu nao sabia que que tinha que deixar esse comando apos add os componentes no painel.
o construtor nao vai fikar ali só criei pra ir testando msm.

porem na clase app eu fiz como explicado, ajudou bastante

obriigado pela ajuda

discorpio

Boa tarde a todos.

Acho que o recomendável é o que o Vini Godoy disse, também não sou muito fã de colocar o setVisible no construtor da classe, além de ter os problemas já citados, você mata a possibilidade de somente de instânciá-lo sem apresentá-lo, imagine se voce tem uma aplicação e esteja carregando, muito embora isto também não seja recomendável, todos os JFrames no momento de instanciação de sua aplicação, como ficaria poluída a tela.

Se não me falhe a memória, além do setVisible, voce também tem que invocar o método pack(), visto que o setVisible apenas apresenta o JFrame sem dimensioná-lo, apenas com sua borda, sendo necessário o pack() que redimensiona repintando o JFrame com suas dimensões mínimas para conter todos os componentes. Este sim é que que ser invocado dentro do construtor, e também ser invocado bem depois da definição de todos os componentes.

Um abraço.

Criado 12 de novembro de 2011
Ultima resposta 13 de nov. de 2011
Respostas 5
Participantes 5