JFrame com vários JPanel

10 respostas
G

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

}

10 Respostas

C

de uma olhada em cardlayout :wink:

J

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.

M

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).

G
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 é  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.<em>;

import java.awt.</em>;

import java.awt.event.<em>;

import java.util.</em>;

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]

G

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…

M

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

G

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

M

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

}
G

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

T

ele só executa uma vez.

o valor de x aumenta porque vc esta incrementando.


virei hello world =D

Criado 6 de fevereiro de 2009
Ultima resposta 6 de mar. de 2009
Respostas 10
Participantes 5