Dúvidas sobre Jbutton

7 respostas
G

Oi gostaria de saber como eu faço um botão que após ser clicado, mude o focus das caixas de texto, e tambem outro botão que apos ser clicado apareça uma janela (showmessage).
Muito obrigado quem puder me ajudar.

7 Respostas

matheuslmota

Cara eu nao entendi muito bem a primeira pergunta, mas quanto a segunda tu pode fazer assim:

JButton teu_botao = new JButton();
JFrame showmessage = new JFrame();
...
teu_botao.addActionListener(){
          showmessage.setvisible(true);

}

Quando o botao for clicado vai exibir a janela de showmessage.
Espero ter ajudado
Abraço :wink:

G

matheuslmota:
Cara eu nao entendi muito bem a primeira pergunta, mas quanto a segunda tu pode fazer assim:

JButton teu_botao = new JButton();
JFrame showmessage = new JFrame();
...
teu_botao.addActionListener(){
          showmessage.setvisible(true);

}

Quando o botao for clicado vai exibir a janela de showmessage.
Espero ter ajudado
Abraço :wink:

Gerar um formulário que apresente um botão. Quando o botão for pressionado apareça seu nome, curso e turno.
Alterar o primeiro formulário, acrescentando um botão que ao ser pressionado pule as caixas de texto com os seguintes dados: identificador, descrição, data e preço.

G

GSFRGV:
Oi gostaria de saber como eu faço um botão que após ser clicado, mude o focus das caixas de texto, e tambem outro botão que apos ser clicado apareça uma janela (showmessage).
Muito obrigado quem puder me ajudar.

Ninguem para ajudar?

o codigo está assim mas eu não sei o codigo para pular de o focus quando clicar no botão

import java.awt.<em>;

import java.awt.event.</em>;

import javax.swing.*;

class Form3 extends JFrame implements ActionListener, TextListener
{

JLabel lblIdentificador, lblProduto;

JLabel lblDataFabricacao,lblPreco;

JTextField txtIdentificador, txtProduto;

JTextField txtDataFabricacao, txtPreco;

JPanel p1,p2,p3,p4;

JButton b1;
public static void main(String args[])

{

JFrame janela = new Form3();

janela.setUndecorated(true);

janela.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);

janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

janela.setVisible(true);

}

Form3()

{

setTitle("Primeiro formulário ");

setBounds(230,50,340,120);  //x,y,w,h

getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));

lblIdentificador = new JLabel(Identificador);

lblIdentificador.setForeground(Color.blue);

lblProduto = new JLabel(Produto);

lblProduto.setForeground(Color.blue);

lblDataFabricacao = new JLabel(Data de fabricação);

lblDataFabricacao.setForeground(Color.blue);

lblPreco = new JLabel(Preço de compra);

lblPreco.setForeground(Color.blue);

b1 = new JButton (MUDAR);

b1.addActionListener(this);

b1.setForeground(Color.blue);

b1.setSize(200,200);

getContentPane().add(b1);
txtIdentificador = new JTextField(5);   
txtProduto = new JTextField(15);
txtDataFabricacao = new JTextField(15);
txtPreco = new JTextField(15);
p1 = new JPanel();        
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel(); 

p1.setBackground(new Color(200,200,200));
p1.add(lblIdentificador); 
p1.add(txtIdentificador);
p2.add(lblProduto);  
p2.add(txtProduto);   
p2.setBackground(new Color(200,200,200));
p2.setBounds(10, 20, 40, 10);
p3.add(lblDataFabricacao);  
p3.add(txtDataFabricacao);   
p3.setBackground(new Color(200,200,200));
p4.add(lblPreco);  
p4.add(txtPreco);   
p4.setBackground(new Color(200,200,200));
getContentPane().add(p1);  
getContentPane().add(p2);
getContentPane().add(p3);
getContentPane().add(p4); 
getContentPane().add(b1);
  }

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void textValueChanged(TextEvent arg0) {
// TODO Auto-generated method stub

}

}

discorpio

Boa noite a todos.

Me perdoe a intromissão Matheuslmota, porém o código que voce passou acima não está correto.

O código correto seria esse:

JButton teu_botao = new JButton();   
        JFrame showmessage = new JFrame();      
        teu_botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showmessage.setVisible(true);
            }
        });

Para responder essa pergunta, primeiramente tenho que consertar a lógica do código que voce postou.

Em seu código, voce colocou alguns JTextField e um JButton para mudar o foco dos JTextFields. De ante mão, esta lógica não está correta e voce sabe porque :?: Muito simples, quando voce clica no botão JButton “Mudar” antes de disparar o método ActionPerformed do ouvinte de evento ActionListener quem ganha o foco é justamente o JButton “Mudar”, para então depois disparar a execução do método citado, neste caso, pegunto, tem como identificar qual o JTextField que está com o foco, no ActionPerformed, se foi o JButton “Mudar” que acabou de ganhar o foco :?: :?: :?: Evidentemente que não.

A maneira correta de fazer isso e fazer com eventos de teclado, ou seja, caso voce acabe de digitar algo dentro do txtIdentificador, ao pressionar Enter ou Tab, mude o foco para JTextField seguinte, ai sim funcionaria, isto porque quando voce digita algo dentro de um JTextField, que mantém o foco é ele, e por isso fica fácil de identificar, então lapidando um pouco o código que voce postou, e tirando o TextListener e o ActionListener e acrescentado o KeyListener, este ficou mais ou menos assim;

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

public class Form3 extends JFrame implements KeyListener
{

JLabel lblIdentificador, lblProduto;
JLabel lblDataFabricacao,lblPreco;
JTextField txtIdentificador, txtProduto;
JTextField txtDataFabricacao, txtPreco;
JPanel p1,p2,p3,p4;
JButton b1;


public Form3()
{
  setUndecorated(true);
  getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
  setLayout(new FlowLayout(FlowLayout.LEFT));
  initComponents();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setTitle("Primeiro formulário ");
  setSize(400,140);
  // setBounds(230,150,340,120); //x,y,w,h
  setResizable(false);
  setLocationRelativeTo(null); // Centraliza o frame
  setVisible(true);
}

private void initComponents(){
  lblIdentificador = new JLabel("Identificador");
  lblIdentificador.setForeground(Color.blue);
  lblProduto = new JLabel("Produto");
  lblProduto.setForeground(Color.blue);
  lblDataFabricacao = new JLabel("Data de fabricação");
  lblDataFabricacao.setForeground(Color.blue);
  lblPreco = new JLabel("Preço de compra");
  lblPreco.setForeground(Color.blue);
  /* b1 = new JButton ("MUDAR");
  b1.setForeground(Color.blue);
  b1.setSize(200,200);
  getContentPane().add(b1); */

  txtIdentificador = new JTextField(5);
  txtIdentificador.addKeyListener(this);
  txtProduto = new JTextField(15);
  txtProduto.addKeyListener(this);
  txtDataFabricacao = new JTextField(15);
  txtDataFabricacao.addKeyListener(this);
  txtPreco = new JTextField(15);
  txtPreco.addKeyListener(this);
  p1 = new JPanel();
  p2 = new JPanel();
  p3 = new JPanel();
  p4 = new JPanel();

  p1.setBackground(new Color(200,200,200));
  p1.add(lblIdentificador);
  p1.add(txtIdentificador);
  p2.add(lblProduto);
  p2.add(txtProduto);
  p2.setBackground(new Color(200,200,200));
  p2.setBounds(10, 20, 40, 10);
  p3.add(lblDataFabricacao);
  p3.add(txtDataFabricacao);
  p3.setBackground(new Color(200,200,200));
  p4.add(lblPreco);
  p4.add(txtPreco);
  p4.setBackground(new Color(200,200,200));
  getContentPane().add(p1);
  getContentPane().add(p2);
  getContentPane().add(p3);
  getContentPane().add(p4);
  getContentPane().add(b1);
  txtIdentificador.grabFocus(); // coloca inicialmente o foco no indentificador
}

public void keyTyped(KeyEvent e) {
  // Método de evento não utilizado porém precisa ser declarado
}

public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_ENTER){
      if (txtIdentificador.hasFocus()){
          txtProduto.grabFocus();
      } else if (txtProduto.hasFocus()){
          txtDataFabricacao.grabFocus();
      } else if (txtDataFabricacao.hasFocus()){
          txtPreco.grabFocus();
      } else if (txtPreco.hasFocus()){
          txtIdentificador.grabFocus();
      }
  }
}

public void keyReleased(KeyEvent e) {
    // Método de evento não utilizado porém precisa ser declarado
}

}

Repare que no código eu comentei o botão “Mudar”, porém caso voce ainda precise dele, não se esqueça de reacrescentar o evento ActionListener de novo, para o implementar o disparo do botão

G

discorpio:
Boa noite a todos.

Me perdoe a intromissão Matheuslmota, porém o código que voce passou acima não está correto.

O código correto seria esse:

JButton teu_botao = new JButton();   
        JFrame showmessage = new JFrame();      
        teu_botao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showmessage.setVisible(true);
            }
        });

Para responder essa pergunta, primeiramente tenho que consertar a lógica do código que voce postou.

Em seu código, voce colocou alguns JTextField e um JButton para mudar o foco dos JTextFields. De ante mão, esta lógica não está correta e voce sabe porque :?: Muito simples, quando voce clica no botão JButton “Mudar” antes de disparar o método ActionPerformed do ouvinte de evento ActionListener quem ganha o foco é justamente o JButton “Mudar”, para então depois disparar a execução do método citado, neste caso, pegunto, tem como identificar qual o JTextField que está com o foco, no ActionPerformed, se foi o JButton “Mudar” que acabou de ganhar o foco :?: :?: :?: Evidentemente que não.

A maneira correta de fazer isso e fazer com eventos de teclado, ou seja, caso voce acabe de digitar algo dentro do txtIdentificador, ao pressionar Enter ou Tab, mude o foco para JTextField seguinte, ai sim funcionaria, isto porque quando voce digita algo dentro de um JTextField, que mantém o foco é ele, e por isso fica fácil de identificar, então lapidando um pouco o código que voce postou, e tirando o TextListener e o ActionListener e acrescentado o KeyListener, este ficou mais ou menos assim;

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

public class Form3 extends JFrame implements KeyListener
{

JLabel lblIdentificador, lblProduto;
JLabel lblDataFabricacao,lblPreco;
JTextField txtIdentificador, txtProduto;
JTextField txtDataFabricacao, txtPreco;
JPanel p1,p2,p3,p4;
JButton b1;


public Form3()
{
  setUndecorated(true);
  getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
  setLayout(new FlowLayout(FlowLayout.LEFT));
  initComponents();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setTitle("Primeiro formulário ");
  setSize(400,140);
  // setBounds(230,150,340,120); //x,y,w,h
  setResizable(false);
  setLocationRelativeTo(null); // Centraliza o frame
  setVisible(true);
}

private void initComponents(){
  lblIdentificador = new JLabel("Identificador");
  lblIdentificador.setForeground(Color.blue);
  lblProduto = new JLabel("Produto");
  lblProduto.setForeground(Color.blue);
  lblDataFabricacao = new JLabel("Data de fabricação");
  lblDataFabricacao.setForeground(Color.blue);
  lblPreco = new JLabel("Preço de compra");
  lblPreco.setForeground(Color.blue);
  /* b1 = new JButton ("MUDAR");
  b1.setForeground(Color.blue);
  b1.setSize(200,200);
  getContentPane().add(b1); */

  txtIdentificador = new JTextField(5);
  txtIdentificador.addKeyListener(this);
  txtProduto = new JTextField(15);
  txtProduto.addKeyListener(this);
  txtDataFabricacao = new JTextField(15);
  txtDataFabricacao.addKeyListener(this);
  txtPreco = new JTextField(15);
  txtPreco.addKeyListener(this);
  p1 = new JPanel();
  p2 = new JPanel();
  p3 = new JPanel();
  p4 = new JPanel();

  p1.setBackground(new Color(200,200,200));
  p1.add(lblIdentificador);
  p1.add(txtIdentificador);
  p2.add(lblProduto);
  p2.add(txtProduto);
  p2.setBackground(new Color(200,200,200));
  p2.setBounds(10, 20, 40, 10);
  p3.add(lblDataFabricacao);
  p3.add(txtDataFabricacao);
  p3.setBackground(new Color(200,200,200));
  p4.add(lblPreco);
  p4.add(txtPreco);
  p4.setBackground(new Color(200,200,200));
  getContentPane().add(p1);
  getContentPane().add(p2);
  getContentPane().add(p3);
  getContentPane().add(p4);
  getContentPane().add(b1);
  txtIdentificador.grabFocus(); // coloca inicialmente o foco no indentificador
}

public void keyTyped(KeyEvent e) {
  // Método de evento não utilizado porém precisa ser declarado
}

public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_ENTER){
      if (txtIdentificador.hasFocus()){
          txtProduto.grabFocus();
      } else if (txtProduto.hasFocus()){
          txtDataFabricacao.grabFocus();
      } else if (txtDataFabricacao.hasFocus()){
          txtPreco.grabFocus();
      } else if (txtPreco.hasFocus()){
          txtIdentificador.grabFocus();
      }
  }
}

public void keyReleased(KeyEvent e) {
    // Método de evento não utilizado porém precisa ser declarado
}

}

Repare que no código eu comentei o botão “Mudar”, porém caso voce ainda precise dele, não se esqueça de reacrescentar o evento ActionListener de novo, para o implementar o disparo do botão

É realmente.
Mas esse codigo aqui faz mudar o cursor só que eu só sei para mudar para a caixa de texto seguinte, se tiver como mudar para as outras

public void actionPerformed(ActionEvent arg0) {
txtIdentificador.nextFocus();

}

matheuslmota

Correto discorpio.
Desculpem por postar o código errado.

ViniGodoy

ATENÇÃO!!!

Leiam o que diz a documentação do método grabFocus():
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JComponent.html#grabFocus%28%29

"javadoc":
This method is intended for use by focus implementations. Client code should not use this method; instead, it should use requestFocus().

Ou seja:
Esse método é feito para ser usado pelo mecanismo de foco, e não deve ser usado nos programas de vocês. Sempre leiam atentamente o javadoc antes de usar qualquer método. Senão depois a aplicação não funciona direito, e quem leva a culpa é o java.

No lugar, o método sugere o uso do requestFocus(). Agora, se vocês forem até a documentação do requestFocus, há uma recomendação lá:
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JComponent.html#requestFocus%28%29

"javadoc":
Because the focus behavior of this method is platform-dependent, developers are strongly encouraged to use requestFocusInWindow when possible

Ou seja, como o comportamento do requestFocus() depende de plataforma, os desenvolvedores são extremamente encorajados a usar o método requestFocusInWindow().

Ou seja:
1. Não utilize grabFocus().
2. Prefira o requestFocusInWindow() ao requestFocus().

O código do discorpio, corrigido, fica:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Form3 extends JFrame implements KeyListener
{

JLabel lblIdentificador, lblProduto;
JLabel lblDataFabricacao,lblPreco;
JTextField txtIdentificador, txtProduto;
JTextField txtDataFabricacao, txtPreco;
JPanel p1,p2,p3,p4;
JButton b1;


public Form3()
{
  setUndecorated(true);
  getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
  setLayout(new FlowLayout(FlowLayout.LEFT));
  initComponents();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setTitle("Primeiro formulário ");
  setSize(400,140);
  // setBounds(230,150,340,120); //x,y,w,h
  setResizable(false);
  setLocationRelativeTo(null); // Centraliza o frame
  setVisible(true);
}

private void initComponents(){
  lblIdentificador = new JLabel("Identificador");
  lblIdentificador.setForeground(Color.blue);
  lblProduto = new JLabel("Produto");
  lblProduto.setForeground(Color.blue);
  lblDataFabricacao = new JLabel("Data de fabricação");
  lblDataFabricacao.setForeground(Color.blue);
  lblPreco = new JLabel("Preço de compra");
  lblPreco.setForeground(Color.blue);
  /* b1 = new JButton ("MUDAR");
  b1.setForeground(Color.blue);
  b1.setSize(200,200);
  getContentPane().add(b1); */

  txtIdentificador = new JTextField(5);
  txtIdentificador.addKeyListener(this);
  txtProduto = new JTextField(15);
  txtProduto.addKeyListener(this);
  txtDataFabricacao = new JTextField(15);
  txtDataFabricacao.addKeyListener(this);
  txtPreco = new JTextField(15);
  txtPreco.addKeyListener(this);
  p1 = new JPanel();
  p2 = new JPanel();
  p3 = new JPanel();
  p4 = new JPanel();

  p1.setBackground(new Color(200,200,200));
  p1.add(lblIdentificador);
  p1.add(txtIdentificador);
  p2.add(lblProduto);
  p2.add(txtProduto);
  p2.setBackground(new Color(200,200,200));
  p2.setBounds(10, 20, 40, 10);
  p3.add(lblDataFabricacao);
  p3.add(txtDataFabricacao);
  p3.setBackground(new Color(200,200,200));
  p4.add(lblPreco);
  p4.add(txtPreco);
  p4.setBackground(new Color(200,200,200));
  getContentPane().add(p1);
  getContentPane().add(p2);
  getContentPane().add(p3);
  getContentPane().add(p4);
  getContentPane().add(b1);
  txtIdentificador.requestFocusInWindow(); // coloca inicialmente o foco no indentificador
}

public void keyTyped(KeyEvent e) {
  // Método de evento não utilizado porém precisa ser declarado
}

public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_ENTER){
      if (txtIdentificador.hasFocus()){
          txtProduto.requestFocusInWindow();
      } else if (txtProduto.hasFocus()){
          txtDataFabricacao.requestFocusInWindow();
      } else if (txtDataFabricacao.hasFocus()){
          txtPreco.grabFocus();
      } else if (txtPreco.hasFocus()){
          txtIdentificador.requestFocusInWindow();
      }
  }
}

public void keyReleased(KeyEvent e) {
    // Método de evento não utilizado porém precisa ser declarado
}

}

Por fim. Gostaria de ressaltar que usar o KeyPress não é a maneira correta de tratar foco (aliás, o KeyPress quase nunca é a maneira correta de se fazer qualquer coisa em Swing). O mecanismo de foco do Java é um pouco mais complexo do que isso. Seria bom ler o artigo da sun How to use the focus subsystem, e também ver esse post do thingol, que explica o jeito certo de fazer:
http://www.guj.com.br/posts/list/92862.java#497384

Criado 18 de agosto de 2010
Ultima resposta 19 de ago. de 2010
Respostas 7
Participantes 4