1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programa em Java IMC

Discussão em 'Programação' iniciada por Ruben-1x, 20 de Junho de 2012. (Respostas: 3; Visualizações: 1851)

  1. Ruben-1x

    Ruben-1x Banido

    Viva Pessoal.

    Estou a estudar Java para o meu exame e estou com algumas dúvidas, será que alguém podia ajudar-me?
    Já não uso java à 6 meses e tá dificil acertar isso.

    É assim eu decidi produzir uma aplicação de cálculo de IMC para praticar Botões, Labels, TextField, listeners, um pouco de tudo.

    Este é o meu código, ainda falta completar com mensagens de erro (tipo dados mal introduzidos e campos por preencher) no ultimo label.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class ex4 extends JFrame{
    JButton calcular, reiniciar;
    JLabel mensagem, idade, peso, altura, nome, mensagem_2, resultado;
    JTextField g_idade, g_peso, g_altura, g_nome;
    float peso1, altura1, resultado1;
    String nome_1, s, tipo, idade_1;
    public ex4 () {
    setTitle ("Calc. IMC");
    setSize (250,300);
    setLocation (800,300);
    //Paineis
    setLayout (new GridLayout(7,1));
    JPanel panel = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();
    JPanel panel5 = new JPanel();
    JPanel panel6 = new JPanel();
    JPanel panel7 = new JPanel();

    //Layouts
    panel.setLayout(new FlowLayout());
    panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
    panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
    panel4.setLayout(new FlowLayout(FlowLayout.LEFT));
    panel5.setLayout(new FlowLayout());
    panel6.setLayout(new FlowLayout(FlowLayout.LEFT));
    panel7.setLayout(new FlowLayout(FlowLayout.LEFT));

    //Criação
    mensagem = new JLabel (" Calculador de IMC", JLabel.CENTER);
    idade = new JLabel ("Idade: ");
    g_idade = new JTextField (5);
    peso = new JLabel ("Peso: ");
    g_peso = new JTextField(5);
    altura = new JLabel ("Altura:");
    g_altura = new JTextField (5);
    nome = new JLabel ("Nome:");
    g_nome = new JTextField (15);
    calcular = new JButton ("Calcular");
    reiniciar = new JButton ("Reiniciar");
    mensagem_2 = new JLabel (" Resultado: ");
    resultado = new JLabel("");

    //Adicionamento
    panel.add(mensagem);
    panel2.add(idade);
    panel2.add (g_idade);
    panel3.add (peso);
    panel3.add(g_peso);
    panel3.add(altura);
    panel3.add(g_altura);
    panel4.add(nome);
    panel4.add(g_nome);
    panel5.add(calcular);
    panel5.add(reiniciar);
    panel6.add(mensagem_2);
    panel7.add(resultado);

    //Adicionamento paineis
    add(panel);
    add(panel2);
    add(panel3);
    add(panel4);
    add(panel5);
    add(panel6);
    add(panel7);

    //Listeners
    addWindowListener (new Terminator());
    TrataEv t = new TrataEv();
    calcular.addActionListener(t);
    reiniciar.addActionListener(t);
    g_idade.addActionListener(t);
    g_peso.addActionListener(t);
    g_altura.addActionListener(t);
    g_nome.addActionListener(t);
    resultado.addFocusListener(t);
    show();
    }
    class TrataEv implements ActionListener, FocusListener{
    public void actionPerformed (ActionEvent e) {
    Object botao = e.getSource();
    if (botao == calcular)
    {
    nome_1 = g_nome.getText();
    idade_1 = g_idade.getText();
    peso1 = Float.parseFloat(g_peso.getText());
    altura1 = Float.parseFloat (g_altura.getText());
    resultado1 = (peso1 / (altura1*altura1));
    if(resultado1 <20)
    {
    tipo = ("magro");
    }
    else if (resultado1 >=25 && resultado1 <30)
    {
    tipo = ("acima do peso");
    }
    else if (resultado1 >=30)
    {
    tipo = ("obeso");
    }
    else {
    tipo = ("normal");
    }
    s = (" Sr(a) " + nome_1 + ", o seu IMC é de "+resultado1 + ". Segundo a sua idade (" + idade_1 + " anos), e de acordo com tabela de IMC, o Sr(a) é considerado " + tipo);
    resultado.setText(s);
    } else
    {
    g_idade.setText("");
    g_peso.setText("");
    g_altura.setText("");
    g_nome.setText("");
    resultado.setText("");
    }

    }
    }
    class Terminator extends WindowAdapter {
    public void WindowClosing (WindowEvent e) {
    System.exit(0);
    }
    }
    public static void main (String args[]) {
    ex4 apl = new ex4();
    }
    }


    O Código ainda não está pronto mas dá para terem uma ideia do que estou a tentar "praticar".

    1) Existe alguma alternativa de utilizar um painel e em cada objecto fazer um enter tipo \n para não tar a fazer imensos paineis?

    2)Como reparam iniciei o primeiro painel com o GridLayout para poder obrigar a ir para baixo. No fim onde diz resultado ficou muito separado da label devido a isso, não dá para remover este espaço?

    3) No ultimo label, que vai indicando ao utilizador acções, como repararam o texto foge da janela, não faz quebra de linha. Já tentei de tudo mas não consigo porque este label ainda está dentro da dita tabela (GridLayout) logo não assume tamanho maior do que uma linha (de altura). Existe maneira de criar um novo conjunto de paineis para meter a dita label num novo layout setLayout (FlowLayout())?

    Estou com imensa dificuldade em criar layouts, existe ciência para isso? Vejo cada programa com objectos bem dispersos e layouts bem estruturados mas tenho imensas dificuldades na criação de objectos e layouts, alguem poderia darme algumas explicações de como orientar isso?

    4) Existe forma de tornar a janela fixa, tipo sem dar para maximizar e reduzir o tamanho?

    5) Tou com um problema no listener na ultima label. Pretendia TextListener mas dava erro, o unico que encontrei que funcionava foi o focus mas a classe TrataEv dá um erro que não entendo, alguem sabe outra alternativa para isso?

    Obrigado a todos pela ajuda :)

    Cumprimentos,
     
    Última edição: 20 de Junho de 2012
  2. raptiler

    raptiler Power Member

    Bom dia, Ruben

    para já deves fazer
    setResizable(false); ao teu Jframe para que não csgs maximizar a janela e os paineis não fiquem desformatados ao fazeres isso.

    deves utilizar um painel principal setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); ou Y_AXIS e depois meter os FLOWLAYOUTS lá dentro.
    Experimenta a criar um painel em Y_Axis e depois adicionar a esse painel os flowlayouts o teu ponto 3 deve ficar resolvido com isso.
    O melhor grid que tens, pelo menos o quanto sei é Gridbaglayout ou algo do genero, só que é um bocado hardmode :)

    Qd implementas o focuslistener na tua classe TrataEv tens k fazer override

    public void focusGained(FocusEvent arg0) {


    }




    public void focusLost(FocusEvent arg0) {



    }

    Acho que não estou a dizer nenhum disparate, já lá vão uns anos :)
     
  3. Ruben-1x

    Ruben-1x Banido

    Obrigado raptiler.

    Existe alguma forma de dar uma quebra de linha entre os objectos que tenho lá? Tipo dar dois espaços entreo resultado? Como o principal é um gridLayout não consigo porque está tipo em tabelas.

    Mas ao aplicar o focuslistener tenho que criar os métodos lá dentro ou posso criar na classe TrataEv?
     
  4. Ruben-1x

    Ruben-1x Banido

    Outra questão, é normal utilizar estes paineis todos? Vocês também criam praticamente 1 para cada linha?

    Será que podias exemplificar o uso do Axis, não tou a conseguir implementar

    Obrigado :)
     

Partilhar esta Página