Problemas com gui em java

3 respostas
V

To tentando implementar meu codigo de adicionar funcionarios em interface grafica, aparentemente nao da erros mas quando copilo causa esseçoes me ajuda ai galera!
ta assim o metodo adiciona cria uma instacia de quantos funcionarios cadastrar, apos isso invoca o metodo adiciona dados,apos ele adiciona o funcionario e seus dados no vetor empregado;

//classe e metodo principal

public class Escola {

  
    public static void main(String[] args) {
       Janela app=new Janela();
       app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
    }//fim metodo principal
   
 }//fim classe principal

//classe funcionarios
import java.awt.Container;
import java.util.Scanner;
import static javafx.application.Platform.exit;
import javax.swing.*;

public  class Funcionarios extends JFrame{
    JLabel nome,salario,profissão,cracha;
    private JTextField nomeT,salarioT,profissãoT,crachaT,nFuncionario;
    private JButton ok,cancelar;
    Container tela=getContentPane();
    static Funcionarios[] empregado=new Funcionarios[100];
   
    public Funcionarios(){
        
        super("Cadastro");
       
        
        setLayout(null);
        setSize(500,300);
        setLocationRelativeTo(null);
        //tela
        tela.add(this.adiciona());
        setVisible(true);
        
        
    }
    
    //metodo adiciona funcionarios
    public Funcionarios adiciona(){
         
           JLabel mensagem;
           
            //recebe o n de funcionarios a ser cadastrado
           mensagem=new JLabel();
           mensagem.setVisible(true);
           mensagem.setBorder(BorderFactory.createTitledBorder("Quantos funcionários deseja adicionar?"));
           mensagem.setBounds(100,40,100,30);
           //textfield
           nFuncionario=new JTextField(10);
           nFuncionario.setBounds(100,60,30,20);
           int adc;
           Funcionarios[] f1=new Funcionarios[adc=Integer.parseInt(nFuncionario.getText())];
           
        for(int i=0;i<f1.length;i++){
            Funcionarios f=new Funcionarios();//adiciona novo funcionario
            //contador
            mensagem=new JLabel();
            mensagem.setBorder(BorderFactory.createTitledBorder("Digite os dados do Funcionario:"+"%20d(i+1)"));
            f.adicionaDados();//dados funcionario
            f1[i]=f;//adiciona funcionario a lista
            mensagem.setVisible(false);
            
        }
        this.empregado=f1;
         return adiciona();
        
    
   }
    //metodo consulta funcionario
   /* public void consulta(){
         Scanner user=new Scanner(System.in);
         //verifica se ha funcionarios cadastrados qundo metodo é acionado
        if(this.empregado==null){
            System.out.println("Não ha funcionarios cadastrados!");

            exit();
        }else{
            for(int i=0;i<empregado.length;i++){

                  System.out.println("Funcionarios cadastrados"+this.empregado.length);
                        //mostra os dados de  cada funcionario
                         System.out.println("\nDeseja ver os dados de algum funcionario?\n digite: true-sim / false=não ");
                         boolean usuario=user.nextBoolean();

                    while(usuario == true){
                         System.out.println("\nDigite o n inscrição do funcionario: ");

                         i=user.nextInt();
                         this.empregado[i].mostra();
                         //break;
                         System.out.println("\n\nDeseja realizar outra consulta?\n true-sim \nfalse-nao");
                         usuario=user.nextBoolean();
                    }

            }    
       }
    }*/
    
    public Funcionarios adicionaDados(){
       //label de dados funcionario
        nome=new JLabel("nome:");
        nome.setBounds(50,50,50,30);
        nomeT=new JTextField(200); 
        nomeT.setBounds(130,50,200,30);
        //
        cracha=new JLabel("crachá:");
        cracha.setBounds(50,90,50,30);
        crachaT=new JTextField(200); 
        crachaT.setBounds(130,90,100,30);
        //
        salario=new JLabel("salario:");
        salario.setBounds(50,120,50,30);
        salarioT=new JTextField(200); 
        salarioT.setBounds(130,120,100,30);
        //
        profissão=new JLabel("profissão:");
        profissão.setBounds(50,150,90,30);
        profissãoT=new JTextField(200); 
        profissãoT.setBounds(130,150,100,30);
        
        return adicionaDados();
    }
   
   
    //metodo mostra
   /* public void mostra(){
     System.out.println("Nome: "+this.getNome());
     System.out.println("Cracha: "+this.getCracha());
     System.out.println("Profissão: "+this.getProfissão());
     System.out.println("Salario: "+this.getSalario());
    }*/
    
    
    
}

//classe Janela

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;
public class Janela extends JFrame {
    
        Container tela=getContentPane();
        JButton cadastro,adicionaF;//
        JLabel nome,salario,profissão,cracha;
        private JTextField nomeT,salarioT,profissãoT,crachaT,nFuncionario;
        //
        
     Janela(){
     super("Ficha Funcionarios");
         adicionaF=new JButton("Adiciona");
         adicionaF.setBounds(200,300,100,20);
         
         adicionaF.addActionListener(
                 new ActionListener(){
                     public void actionPerformed(ActionEvent e){
                     
                     new Funcionarios().setVisible(true);
                     
                     }
     
     
     });
        //basico tela
           setSize(720,720);
           setLocationRelativeTo(null);
           setLayout(null);
           tela.add(adicionaF);
          
          
           setVisible(true);
    
    }
}

3 Respostas

wldomiciano

Rodei seu código e vi que a exceção lançada é a NumberFormatException. Olhando mais atentamente descobri que o trecho que a causa é esse:

Funcionarios[] f1 = new Funcionarios[
        adc = Integer.parseInt( nFuncionario.getText() ) ];

O problema aqui é que seu método main invoca new Janela() e…

  • new Janela() cria um JButton
  • e este JButton, quando clicado invoca new Funcionarios()
  • e new Funcionarios() invoca this.adiciona()
  • e em adiciona() é onde se encontra o trecho que citei acima!

O problema é que vc tá invocando o método getText() do JLabel (nFuncionario) antes mesmo de ele ter a oportunidade de aparecer na tela, quando seu valor ainda é uma string vazia. Daí a mensagem que aparece:

java.lang.NumberFormatException: For input string: ""

Bom, apenas para testar, substituí o o código citado por:

Funcionarios[] f1 = new Funcionarios[0];

E descobri que ele entra em um loop infinito porque o método adiciona() invoca a si mesmo no final. Ou seja, é um método recursivo e por isso traz outros problemas mais sérios que a exceção que vc viu.

Pelo que entendi, nesta linha vc quer saber quantos funcionários serão cadastrados. Se for isso mesmo, porque saber disso? Deixe que a pessoa responsável pelo cadastrado clique em Adiciona quantas vezes ela quiser, até porque pode ser que ela nem saiba logo no inicio o número de cadastros que serão feitos.

Outra coisa que vc parece estar confundindo é o que é um funcionário. Olha este trecho:

for(int i = 0; i < f1.length; i++){
  Funcionarios f = new Funcionarios(); //adiciona novo funcionario
  /* ... */
}

Parece fazer sentido, mas não podemos esquecer que Funcionarios é um JFrame! Vc realmente quer criar uma nova janela para cada funcionário a ser cadastrado?

Pense assim: uma coisa é a entidade funcionário outra coisa diferente é a tela de cadastrado deste funcionário. Seriam duas classes diferentes.

class Funcionario {
  private String nome, profissao, cracha, salario;
  /* Aqui vc cria o contrutor e qualquer getter/setter que achar apropriado */
}

class TelaCadastroFuncionario extends JFrame {
  /* Apresenta o formúlario para o preenchimento dos dados
     do novo funcionário e o botão para salvar */
}

Vê se estas dicas te ajudam; qualquer coisa posta aê.

Obs.: Fiz uma versão do seu programa. Não usei as dicas que dei de ter classes separadas pra funcionário e pra tela de cadastro, mas tá funcional. Segue o link caso queira usar pra alguma coisa.

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

class App {
    public static void main(String... args) {
        new TelaInicio();
    }
}

class TelaAdicionaFuncionario extends JFrame {
    private String[]     campos     = { "Nome", "Profissão", "Crachá", "Salário" };
    private JTextField[] textFields = new JTextField[ campos.length ];
    private JPanel       painel     = new JPanel();

    private void init() {
        painel.setLayout( new BoxLayout( painel, BoxLayout.Y_AXIS ) );

        for(int i = 0; i < campos.length; i++) {
            textFields[i] = new JTextField();
            painel.add( new JLabel( campos[i] ) );
            painel.add( textFields[i] );
        }

        JButton botao = new JButton( "Salvar" );
        botao.addActionListener( (actionListener) -> salvar() );

        painel.add( botao );
        add(painel);
    }

    private void salvar() {
        for (int i = 0; i < campos.length; i++)
            System.out.printf( "%10s: %s\n", campos[i], textFields[i].getText() );

        dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
    }

    TelaAdicionaFuncionario() {
        super("Cadastro");

        init();
        setSize(300, 250);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}

class TelaInicio extends JFrame {
    TelaInicio() {
        super("Ficha Funcionarios");

        JButton adicionarFuncionario = new JButton("Adicionar");

        adicionarFuncionario.setBounds( 150, 100,100,50);
        adicionarFuncionario.addActionListener( ( actionListener ) -> new TelaAdicionaFuncionario() );

        add(adicionarFuncionario);
        setSize(400,300);
        setLocationRelativeTo(null);
        setLayout(null);
        setVisible(true);
    }
}
D

Muito bom, uma análise completa do código dele que deve ter sido trabalhosa. :slight_smile:

V

Muito obrigado pela ajuda ,iniciei minha jornada em java faz pouco tempo vejo q tenho muito a aprender;

Criado 14 de abril de 2017
Ultima resposta 17 de abr. de 2017
Respostas 3
Participantes 3