Jump to content

Dúvida GUI


FXX

Recommended Posts

Bom dia,

Tenho uma dúvida que ainda não consegui esclarecer após várias pesquisas.

É a primeira vez que estou a desenvolver uma aplicação Java com GUI.

Para já tenho uma JFrame com uma JMenuBar com diversas opções que mostraram opções de configuração da aplicação em si.

A minha dúvida é se após clicar numa opção da barra de menus deva mostrar os controlos (labels, caixas de texto e botões) num JPanel ou noutro JFrame.

Agradeço se me poderem ajudar.

Link to comment
Share on other sites

Na interface gráfico o que te permive fazer X quando se clica em Y chama-se eventos.

Exemplo que eu fiz:

import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class AprenderEventos extends JFrame{
private JButton bt1, bt2;
private JPanel panel_a, panel_b;
public AprenderEventos(){
	// -- criar os butoes --
	bt1 = new JButton("BT 1");
	bt2 = new JButton("BT 2");
	// -- adicionalos ao painel --
	panel_a = new JPanel();
	panel_b = new JPanel();
	panel_a.add(bt1);
	panel_a.add(bt2);

	// -- Defenir quem vai tratar os eventos dos botoes --
	Eventos ev = new Eventos();
	bt1.addActionListener(ev);
	bt2.addActionListener(ev);

	// -- adicionar ao painel um componente a sorte --
	panel_b.add(new JLabel("Teste aparece"));
	// -- o painel b vai estar desactivado no inicio do programa --
	panel_b.setVisible(false);

	// -- Adicionar os paineis a janela um no centro outro no fundo --
	add(BorderLayout.CENTER, panel_a);
	add(BorderLayout.SOUTH, panel_b);

	// -- tornar a janela visivel e com tamanho 200,100 --
	setVisible(true);
	setSize(200,100);
}

private class Eventos implements ActionListener{
	Object obj;

	@Override
	public void actionPerformed(ActionEvent ae) {
	   // -- ae devolve o objecto que foi clicado e eu guardo-o em obj --
		obj = ae.getSource();

		// -- se eo objecto que foi clicado foi o bt1 --
		if(obj == bt1){
			panel_b.setVisible(true);
		}else{
		// -- se for outro componenete qualquer --
			panel_b.setVisible(false);
		}
	}


}

public static void main(String[] args) {
	new AprenderEventos();
}
}
Edited by skinie18
Link to comment
Share on other sites

Antes demais agradeço as duas respostas.

Então no caso de eu ter por exemplo 5 painéis, cada vez que quero mostrar um painel passo-o para visível (setVisivel(true)) e os outros 4 para "invisíveis" (setVisible(false)), uma vez que não sei qual dos painéis estava visível. É assim?

Exacto!

Link to comment
Share on other sites

Antes demais agradeço as duas respostas.

Então no caso de eu ter por exemplo 5 painéis, cada vez que quero mostrar um painel passo-o para visível (setVisivel(true)) e os outros 4 para "invisíveis" (setVisible(false)), uma vez que não sei qual dos painéis estava visível. É assim?

O método que penso que seja mais apropriado é o uso de CardLayout.

http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

Link to comment
Share on other sites

O método que penso que seja mais apropriado é o uso de CardLayout.

http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

Sim por acaso nao tinha pensado nisso mas sim, esse é o método mais apropriado no entanto para quem esta a aprender interface gráfica agora é capaz de ficar meio confuso com o CardLayout.

FXX nao sei se sabes mas cada Panel ou Frame tem um layout, acho que por defeito o dos paines é FlowLayout e o dos Frames é BorderLayout. Cada layout tem as suas propriedades. O que o jpedro20 esta a propor é criares um Painel com o CardLayout, o card layout permite-te guardar vários cartoes (varios paineis) dentro de um só e podes fazer o switch entre os paineis a qualquer altura do codigo.

SIMPLIFICANDO.

é como que adicionares os teus 5 painéis dentro de um livro e quando queres mostrar um deles dizes a pagina que queres que o livro abra e ele abre essa pagina, e podes a qualquer momento mudar para outra pagina.

O código que te mandei a pouco mas aplicando a filosofia do CardLayout:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class AprenderEventos extends JFrame {
private JButton bt1, bt2, bt3;
private JPanel panel_buttons, panel_main, panel_1, panel_2, panel_3;
private CardLayout cl;
public AprenderEventos() {
	// -- criar os butoes --
	bt1 = new JButton("BT 1");
	bt2 = new JButton("BT 2");
	bt3 = new JButton("BT 3");
	// -- inicializar paineis --
	cl = new CardLayout();
	panel_buttons = new JPanel();
	panel_main = new JPanel(cl);
	panel_1 = new JPanel();
	panel_2 = new JPanel();
	panel_3 = new JPanel();
	// -- Adicionar componentes --
	panel_buttons.add(bt1);
	panel_buttons.add(bt2);
	panel_buttons.add(bt3);
	panel_1.add(new JLabel("Painel 1"));
	panel_2.add(new JLabel("Painel 2"));
	panel_3.add(new JLabel("Painel 3"));
	panel_main.add(panel_1, "pp");
	panel_main.add(panel_2, "ss");
	panel_main.add(panel_3, "tt");
	// -- Defenir quem vai tratar os eventos dos botoes --
	Eventos ev = new Eventos();
	bt1.addActionListener(ev);
	bt2.addActionListener(ev);
	bt3.addActionListener(ev);
	// -- o painel main vai estar desactivado no inicio do programa --
	panel_main.setVisible(false);
	// -- Adicionar os paineis a janela um no centro outro no fundo --
	add(BorderLayout.CENTER, panel_buttons);
	add(BorderLayout.SOUTH, panel_main);
	// -- tornar a janela visivel e com tamanho 300,100 --
	setVisible(true);
	setSize(300, 100);
}
private class Eventos implements ActionListener {
	Object obj;
	@Override
	public void actionPerformed(ActionEvent ae) {
		// -- ae devolve o objecto que foi clicado e eu guardo-o em obj --
		obj = ae.getSource();
		// -- Caso seja carregado em algum dos botoes os paineis ficam visiveis --
		panel_main.setVisible(true);
		// -- se eo objecto que foi clicado foi o bt1 --
		if (obj == bt1) {
			cl.show(panel_main, "pp");
		} else if (obj == bt2) {
			cl.show(panel_main, "ss");
		} else {
			cl.show(panel_main, "tt");
		}
	}
}
public static void main(String[] args) {
	new AprenderEventos();
}
}
Edited by skinie18
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.