JFrame com vários JPanel

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();
}

de uma olhada em cardlayout :wink:

ghatien,

Você está criando uma única instância de cada objeto? ou cada vez que exibe cria um novo?

Poste o pedaço do seu código para entendermos melhor o que está acontecendo.

Abraço.

Como são vários JPanels talvez seja mesmo interessante usar o CardLayout, pois todos os painéis são criados e adicionados ao JFrame de usa vez (preferenciamente durante a construção do JFrame) e basta ir alternando entre os painéis visíveis.

Informação útil para pode usar o CardLayout:
Documentação: http://java.sun.com/javase/6/docs/api/java/awt/CardLayout.html
Tutorial: http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html (inclusive aqui há exemplos de utilização que podem ser executados para verificar se realmente é isso que você deseja).

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.
[i]
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();
		}
	});
}

}[/i]

marcobiscaro2112, o cardLayout não parece ser aquilo que pretendo…

O que eu quero do meu programa é que seja uma base de dados de clientes… cada cliente tem que ter registo dos equipamentos que comprou e usa…

Portanto, quando inicio o programa, aparece na frame os botões “Consultar” e “Modificar”. Cliclando em “Modificar” aparecem os botões “Inserir Cliente”, “Inserir Equipamento” e “Alterar Registo”. Se tivesse carregado em “Consultar”, apareceria “Consultar Cliente”, Consultar Equipamento" e “Consultar Local”… e por aí fora…

pensei que esta maneira com JFrame e vários JPanel fosse a melhor maneira mas, como sou um pouco “maçarico” em JAVA, devo estar a fazer coisas bastante erradas sem me aperceber…

Por que não usa um JMenuBar contendo as opções, que nada mais são que uma espécie de menu?

marcobiscaro2112, antes de pensar numa forma diferente de fazer o programa, gostava de saber o que se passa com este programa para que ele não esteja a funcionar correctamente… Não entendo a razão pela qual a actionPerformed tem que correr várias vezes até encontrar a acção do botão selecionado… esse código que coloquei mostra as vezes que o actionPerformed corre. Se alguém quiser dar uma vista de olhos e conseguir perceber o problema, agradecia ajuda

Obrigado

Bom, nada melhor que um exemplo para um bom entendimento. Veja esse exemplo. Tentei ser o mais claro possível, mas qualquer dúvida, é so perguntar:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class ExemploAction extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JButton botao1;
	private JButton botao2;
	private JTextArea editorStatus;
	private JScrollPane scrollPane;

	public ExemploAction() {
		super();
		initGUI();
	}

	public static void main(final String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				final ExemploAction inst = new ExemploAction();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}

	@Override
	public void actionPerformed(final ActionEvent arg0) {
		getEditorStatus().append(
				((JButton) arg0.getSource()).getText() + " foi pressionado!\n");
	}

	private JButton getBotao1() {
		if (botao1 == null) {
			botao1 = new JButton();
			botao1.setText("Botão 1");
			botao1.addActionListener(this);
		}
		return botao1;
	}

	private JButton getBotao2() {
		if (botao2 == null) {
			botao2 = new JButton();
			botao2.setText("Botão 2");
			botao2.addActionListener(this);
		}
		return botao2;
	}

	private JTextArea getEditorStatus() {
		if (editorStatus == null) {
			editorStatus = new JTextArea();
			editorStatus.setAutoscrolls(true);
			editorStatus.setEditable(false);
			editorStatus.setEnabled(false);

		}
		return editorStatus;
	}

	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setViewportView(getEditorStatus());
		}
		return scrollPane;
	}

	private void initGUI() {
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

		setLayout(new GridBagLayout());
		final GridBagConstraints constraints = new GridBagConstraints(0, 0, 1,
				1, 0.1, 0.1, GridBagConstraints.PAGE_START,
				GridBagConstraints.NONE, new Insets(10, 3, 3, 3), 0, 0);
		
		add(getBotao1(), constraints);
		constraints.gridx = 1;
		add(getBotao2(), constraints);
		constraints.gridx = 0;
		constraints.gridy = 1;
		constraints.gridwidth = 2;
		constraints.weighty = 1.0;
		constraints.fill = GridBagConstraints.BOTH;
		constraints.anchor = GridBagConstraints.CENTER;
		add(getScrollPane(), constraints);
		
		setSize(400, 300);
		getEditorStatus().append("Programa iniciado!\n");
	}

}

marcobiscaro, obrigado pelo trabalho mas não era isso que eu pretendia…

Eu gostava que olhassem para o código que postei em cima e que me pudessem explicar a razão pela qual o ActionListener corre várias vezes até encontrar a acção do JButton pressionado…

Alguém me pode explicar o porquê?

Obrigado

ele só executa uma vez.

o valor de x aumenta porque vc esta incrementando.


virei hello world =D