Ir para conteúdo
Fórum Script Brasil
  • 0

ActionListener corre várias vezes


ghatien

Pergunta

Boa tarde

Gosto de programar em java, apesar de não saber muito...

Estou presentemente a fazer um programa (como hobbie) que é uma base de dados mas com janelas...

após ler alguns tutoriais e programas feitos consegui desenvolver a minha frame com os diversos paineis.

A maneira, que eu pensei ser a certã, para fazer funcionar o programa é:

Tenho a penas uma JFame. Há medida que os botões são cliclados, retiro o JPanel activo no Jframe (com a acção frame.getContentsPane().removeAll()) e adiciono o novo painel com os novos botões...

No inicio parecia que tudo estava a funcionar correctamente mas agora que estou a começar a inserir os valores deparei-me com vários problemas.

O primeiro ( e penso que o responsável por todos os outros) é que, quando carrego a primeira vez num botão ele faz correr o actionPerformed(actionEvent e) uma vez. Quando carrego pela segunda vez num botão, o actionPerformed corre duas vezes até encontrar o botão accionado, três vezes corres três vezes e assim sucessivamente... qual a razão para isto acontecer? alguém sabe?

Fica aqui um bocado do actionPerformed:

public void actionPerformed(ActionEvent event)

{

Object src = event.getSource();

if(src==buttonConsultar) Consultar();

if(src==buttonVoltarInicio) inicio();

}

Este não é o código do meu programa (pois ele é bastante grande) mas é um programa parecido, mais simples, e com o mesmo problema.

A variavel int x é só para ajudar a perceber quantas vezes ele corre o actionlistener até encontrar o botao accionado. O system.out.println() foi para conseguir ver.

import java.lang.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

public class Main implements ActionListener{

static JFrame frame;

int x=0;

JButton button1 = new JButton("1");

JButton button2 = new JButton("2");

JLabel labelTeste = new JLabel("Teste", JLabel.CENTER);

public Main(){

JPanel painel = new JPanel(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.gridx = 0;

c.gridy=1;

button1.addActionListener(this);

painel.add(button1,c);

c.gridx=0;

c.gridy=0;

c.gridwidth=2;

painel.add(labelTeste,c);

frame.getContentPane().add(painel, BorderLayout.CENTER);

frame.pack();

frame.setVisible(true);

}

public void botao1(){

frame.getContentPane().removeAll();

JPanel painel = new JPanel(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.gridx = 0;

c.gridy=1;

button1.addActionListener(this);

painel.add(button1,c);

c.gridx=0;

c.gridy=0;

c.gridwidth=2;

painel.add(labelTeste,c);

frame.getContentPane().add(painel, BorderLayout.CENTER);

frame.pack();

frame.setVisible(true);

}

public void botao2(){

frame.getContentPane().removeAll();

JPanel painel = new JPanel(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.gridx = 0;

c.gridy=1;

button2.addActionListener(this);

painel.add(button2,c);

c.gridx=0;

c.gridy=0;

c.gridwidth=2;

painel.add(labelTeste,c);

frame.getContentPane().add(painel, BorderLayout.CENTER);

frame.pack();

frame.setVisible(true);

}

public void actionPerformed(ActionEvent event)

{

Object src = event.getSource();

if(src==button1) botao2();

if(src==button2) botao1();

System.out.println("actionlistener "+x);

x++;

}

public static void start(){

JFrame.setDefaultLookAndFeelDecorated(true);

Main start2 = new Main();

}

public static void main(String[] args)

{

frame = new JFrame("Hanovia");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run(){

start();

}

});

}

}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Você só precisa adicionar o ActionListener uma vez para cada botão.

Assim deve funcionar:

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

public class Main implements ActionListener
{

    static JFrame frame;

    int x = 0;

    JButton button1 = new JButton("1");
    JButton button2 = new JButton("2");

    JLabel labelTeste = new JLabel("Teste", JLabel.CENTER);

    public Main()
    {
        JPanel painel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 1;
        button1.addActionListener(this);
        button2.addActionListener(this);
        painel.add(button1, c);

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        painel.add(labelTeste, c);

        frame.getContentPane().add(painel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public void botao1()
    {
        frame.getContentPane().removeAll();

        JPanel painel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 1;
        //button1.addActionListener(this);
        painel.add(button1, c);

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        painel.add(labelTeste, c);

        frame.getContentPane().add(painel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public void botao2()
    {
        frame.getContentPane().removeAll();

        JPanel painel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0;
        c.gridy = 1;
        //button2.addActionListener(this);
        painel.add(button2, c);

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        painel.add(labelTeste, c);

        frame.getContentPane().add(painel, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent event)
    {

        Object src = event.getSource();
        if(src == button1)
            botao2();
        if(src == button2)
            botao1();
        System.out.println("actionlistener " + x);
        x++;
    }

    public static void start()
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        Main start2 = new Main();
    }

    public static void main(String[]args)
    {
        frame = new JFrame("Hanovia");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { start();} });
    }

}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...