Galera estou montando o esqueleto de uma Calculadora para aprender a usar o Swing, porém estou com dificuldade em alinhar os botões, segue o código que fiz:
Estou pensando em organizar ela em 4 partes, ou seja, criar 4 painéis:
1 - panelWest para os operandos
2 - panelCentral para os operadores
3 - panelEast para outros operadores
4 - panelNorth para a tela
Não consigo realizar a quebra de linha nos botões, estão saindo assim:
Paulo estou tentando faze desta forma mas não tá dando "/
panelWest.setLayout(newGridLayout(3,3));
O que estou fazendo errado?
Paulo_Dias
é assim mesmo, qual erro tá dando?
vc tbm pode tentar:
panelWest=newJPanel(newGridLayout(3,3));
gRoOve
Faltou limpar o projeto, hehe. Agora funcinou. Olha meu código:
packageswingbasico;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.GridLayout;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JTextField;importjavax.swing.UIManager;publicclassCalculadoraGUI{privateJFrameframe;privateJPanelpanelWest,panelCentral,panelNorth,panelEast;privateJButton[]buttonWest,buttonCenter,buttonEast;privateJTextFieldtextFieldNorth;privatevoidmakeGUI(){frame=newJFrame("Calculadora");panelWest=newJPanel();panelCentral=newJPanel();panelNorth=newJPanel();panelEast=newJPanel();buttonWest=newJButton[9];buttonCenter=newJButton[4];buttonEast=newJButton[1];textFieldNorth=newJTextField(10);//criar botoes da regiao oestebuttonWest[0]=newJButton("7");buttonWest[1]=newJButton("8");buttonWest[2]=newJButton("9");buttonWest[3]=newJButton("4");buttonWest[4]=newJButton("5");buttonWest[5]=newJButton("6");buttonWest[6]=newJButton("1");buttonWest[7]=newJButton("2");buttonWest[8]=newJButton("3");//criar botoes da regiao centralbuttonCenter[0]=newJButton("/");buttonCenter[1]=newJButton("*");buttonCenter[2]=newJButton("-");buttonCenter[3]=newJButton("+");//criar botoes da regiao lestebuttonEast[0]=newJButton("=");for(inti=0;i<buttonWest.length;i++){buttonWest[i].setPreferredSize(newDimension(45,30));//defir tamanho dos botoes da painel oestepanelWest.add(buttonWest[i]);//adicionar botoes ao painel oeste}for(inti=0;i<buttonCenter.length;i++){buttonCenter[i].setPreferredSize(newDimension(50,30));//definiar tamahno do botoes do painel centralpanelCentral.add(buttonCenter[i]);//adicionar bootoes ao painel central}buttonEast[0].setPreferredSize(newDimension(35,30));panelNorth.add(textFieldNorth);//adicionar campo de texto ao painel nortepanelEast.add(buttonEast[0]);//adicionar botao ao painel lestepanelCentral.setLayout(newGridLayout(0,1));panelWest.setLayout(newGridLayout(3,3));panelEast.setLayout(newGridLayout(0,1));frame.getContentPane().add(BorderLayout.CENTER,panelCentral);frame.getContentPane().add(BorderLayout.WEST,panelWest);frame.getContentPane().add(BorderLayout.NORTH,panelNorth);frame.getContentPane().add(BorderLayout.EAST,panelEast);frame.setResizable(false);frame.pack();frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicstaticvoidmain(String[]args)throwsClassNotFoundException{try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptione){e.printStackTrace();}newCalculadoraGUI().makeGUI();}}
Agora vou começar a implementar os métodos actionPerformed de cada botão, contudo estou em dúvida de como organizar o código, será que se colocar tudo ai vai ficar bagunçado? Ou será que crio outra classe só pra chamar os actionPerformed?
Aceito sugestões quando a estruturação
T
t3sting
cara vc pode criar outra classe sim fica mais organizado
outra coisa que sugiro ao invés de especificar aquele tanto de import no começo do código usa o
Primeiro vou tentar fazer tudo na mesma classe dpois organizo pois ta complicado, hehe.
Estou com dificuldade de saber de qual botão está vindo o ActionEvet, estou fazendo assim:
Como faço pra no metodo actionPerformed saber qual botão está sendo ouvido?
Deixei as imports assim pra eu saber exatamente com qual classe estrou trabalhando, hehe.
T
t3sting
vc tem que especificar pro actionPerformed qual botão fará o que quando sofrer a ação
usando array vai meio complicado pra saber qual botão colocar
gRoOve
Consegui fazer usando classes internas, mas agora não faço idéia de como fazer a operação, soma, divisão e talz.
Seria isso?
de if e tasls pra fazer as operações vc pode criar um método pra isso olha o exemplo de uma calculadora aki
publicvoidactionPerformed(ActionEvente){converter();//Metodo para pegar dados e converterif(e.getSource()==bt_somar||e.getSource()==mi_somar){resultado=num1+num2;//tf_resultado.setText(String.valueOf(resultado)); }if(e.getSource()==bt_subtrair||e.getSource()==mi_subtrair){resultado=num1-num2;}if(e.getSource()==bt_multiplicar||e.getSource()==mi_multiplicar){resultado=num1*num2;}if(e.getSource()==bt_dividir||e.getSource()==mi_dividir){resultado=num1/num2;}exibe();//Método para exibir resultadoif(e.getSource()==bt_limpar||e.getSource()==mi_limpar){tf_num1.setText("");tf_num2.setText("");tf_resultado.setText("");tf_num1.requestFocus();}if(e.getSource()==bt_sair||e.getSource()==mi_sair){System.exit(0);}}publicvoidconverter(){num1=Double.parseDouble(tf_num1.getText());num2=Double.parseDouble(tf_num2.getText());}publicvoidexibe(){tf_resultado.setText(""+calculo.format(resultado));}}
Implementando uma interface
public interface Interface_1
{
public void converter();
public void exibe();
}
gRoOve
Não estou conseguindo encontrar a lógica pra pegar o valor dos números, numA e numB para realizar as operações "/
Não foi desta forma não, ele consegue criar um ActionPerformed usando o nome de cada componente, por exemplo:
JButtonbutton=newJButton()
e faz o ActionPerformed assim:
publicvoidbuttonActionPerformed(){}
Realmente fiquei perdido quando vi isso, se alguém tiver idéia. Obs.: ele cria a GUI usando o JFrameCreator do Netbeans, não sei se tem algo a ver.
Eric_Yuzo
O NetBeans cria uma classe anônima estendendo ActionListener e dentro dela ele chama o método citado. Mais ou menos assim:
// Dentro do construtorbtnOk.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){btnOkActionPerformed(e);}});btnCancelar.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){btnCancelarActionPerformed(e);}});...// No corpo da classeprivatevoidbtnOkActionPerformed(ActionEvente){...}privatevoidbtnCancelarActionPerformed(ActionEvente){...}
Mas não é necessário criar este método, você pode colocar a implementação diretamente no método actionPerformed.
Estou quase entendendo, eu tinha lido que o correto seria usar classes internas, cada uma para escutar um componente diferente, ai cada classe interna implementaria ActionListener. Está um pouco diferente com classes anonimas e como não entendo sobre elas fiquei meio perdido, hehe.
Gostei deste artigo, vou ler com calma. Obrigado.
Eric_Yuzo
Classes anônimas também são classes internas. Se chamam de anônimas, pois não definimos um nome para elas. Elas geralmente são criadas na atribuição de uma variável de referência ou na passagem de um parâmetro (nosso caso).
btnOk.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnOkActionPerformed(e);
}
});
Neste trecho, foi definida uma classe anônima (sem nome), que implementa ActionListener, assim somos obrigados a implementar seus métodos abstratos, neste caso o actionPerformed.
No caso da calculadora, acho mais interessante criar Actions, assim pode atribuí-las aos botões e ainda registrá-las no InputMap para que sejam executadas a partir do teclado. Isso tudo está no artigo do ViniGodoy.
H
hich
Cara usa a Visual Class, ia te facilitar muito nisso.
gRoOve
O que é a Visual Class?
H
hich
um plugin do eclipse, para aplicações desktop.
gRoOve
Eu uso o Netbeans, então não sei o que é, hehe.
Um plugin que faz exatamente o que?