Telas em Aplicações desktop com java [RESOLVIDO]

Boa noite galera do guj.

Sou iniciante em java, porém quaz tudo que vejo é novo pra mim, e com isso muitas duvidas surgem.

Estou desenvolvendo uma aplicação desktop e de “inicio” fiz um frame principal que possui um jMenu com dois jMenuItem, um para cadastro de cliente e o outro de cadastro de Funcionarios.

Minha duvida é o seguinte, para cada jMenuItem, tenho que criar um novo JFrame? criando um Jframe posso separar uma classe para Cadastro de clientes e outra para cadastro de Funcionarios?, mas se eu criar mais jMenuItem ficaria com muitas janelas e se eu abrir a tela de cadastro de clientes e de cadastro de funcionarios não ficará dentro da frame principal como um jDesktopPane certo? pois se eu minimizar o frame principal as telas abertas náo minimizar correto?

E se eu fizer com jTabbedPane, tipo quando clicar em um jMenuItem ele habilitar um novo jTabbedPane, praticamente todo o codigo fonte ficaria no frame principal correto?
tem como eu criar um novo jTabbedPane para cada tela? por exemplo: uma para cadastro de clientes e uma para cadastro de funcionarios, senão teria que adicionar varios jTabbedPane no frame principa o codigo ficaria todo no frame principal, ou seja ficaria gigante demais.

O que vocês sugerem? como vocês usaria? e se tiver melhora o entedimento.

Obrigado(a).

não existe uma receita de bolo…

tudo que você disse é possivel…

só um detalhe…cada tela é um novo jframe…(mais vc poderia colocar tudo na mesma janela e ir trocando os elementos, “seria a pior forma possivel”)

como eu disse tudo é possivel, o que vai fazer o sistema funcionar de uma maneira ou de outra é a sua lógica,

pode ser que você siga um padrão existe e sua app nao faça sucesso…

o lance de todo o codigo ficar no frame principal, é uma má pratica…, o correto é que exista classes para tratar as informações, e o Jframe apenas chama os métodos dessas classes…

de uma estudada sobre classes, objetos, DAOs… vai te dar uma clareada…

uma lida na FJ-11 da caelum também é uma boa idéia…

Só se você for trabalhar somente com JFrame. Você pode trabalhar com o JInternalFrame. Mas para trabalhar com JInternalFrame, você precisa trabalhar com o JDesktopPane.

Da uma pesquisada nessas classes no api do java.

Oi. Sua dúvida é do fórum de interface gráfica. Movi o tópico, mas por favor, leia com atenção a descrição dos fóruns quando for postar.

Se for trabalhar com o JTabbedPane, você cria um JPanel separado para cada tela.

Normalmente, o menu é algo particular de cada tela, e criamos menuItems tela por tela. Até porque, mesmo as opções de menu sejam iguais, teremos comportamentos diferentes em cada tela.

Obrigado a todos que responderam.

ViniGodoy, sua resposta é exatamente o que queria saber, mas ainda tenho algumas duvidas.

Como poderei criar um JPanel separado com um JTabbedPane, e depois chamar em meu JMenuItem do meu JFrame Principal.

Se tiver Exemplos agradeço.

Obrigado.

Você cria um JPanel exatamente igual cria um JFrame ou JDialog.

Depois, basta usar o método addTab do TabbedPane. Dê uma olhada:
http://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html

aonde trabalho tem uma seria de telas que usam JInternalFrame ( cadastros, consultas e relatórios), em alguma situações é interessante abrir um JInternalFrame desses com um coportamento de JDialog, dai bolei uma estrutura genérica.
é desenvolvido tudo em cima do JPanel e com umas mandigas de Design Patterns, injeto um comportamento de um JInternalFrame ou de JDialog …
isto pode ser implementado futuramente para JTabbedPane… dai vai da imaginação de cada um

estou implantando isto agora e da dando um trabalha grande para refatorar, mais o resultado vai ser bom

Veja o que queria, mas não sei se é o modo mais correto.

Aqui criei um JPanel de teste apenas para a tela de cadastro

import javax.swing.JPanel;

import org.dyno.visual.swing.layouts.GroupLayout;


public class TesteJPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	private JPanel jPanel0;

	public TesteJPanel() {
		initComponents();
	}

	private void initComponents() {
		setLayout(new GroupLayout());
		setSize(682, 418);
	}

	protected JPanel getJPanel0() {
		if (jPanel0 == null) {
			jPanel0 = new JPanel();
			jPanel0.setLayout(new GroupLayout());
			
		}
		return jPanel0;
	}

}

Minha Tela de teste principal

import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.dyno.visual.swing.layouts.Bilateral;
import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;



public class TestePrincipal extends JFrame {

	private static final long serialVersionUID = 1L;
	private JTabbedPane jTabbedPane0;
	private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel";
	public TestePrincipal() {
		initComponents();
	}

	private void initComponents() {
		setLayout(new GroupLayout());
		add(getJTabbedPane0(), new Constraints(new Bilateral(0, 0, 5), new Leading(0, 492, 6, 6)));
		setSize(788, 492);
	}

	private JTabbedPane getJTabbedPane0() {
		if (jTabbedPane0 == null) {
			jTabbedPane0 = new JTabbedPane();
			jTabbedPane0.addTab("teste", new TesteJPanel()); // aqui chamei minha tela TesteJPanel com o metodo addTab() do JTabbedPane.
		}
		return jTabbedPane0;
	}

	private static void installLnF() {
		try {
			String lnfClassname = PREFERRED_LOOK_AND_FEEL;
			UIManager.setLookAndFeel(lnfClassname);
		} catch (Exception e) {
			System.err.println("Cannot install " + PREFERRED_LOOK_AND_FEEL
					+ " on this platform:" + e.getMessage());
		}
	}

	public static void main(String[] args) {
		installLnF();
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				TestePrincipal frame = new TestePrincipal();
				Teste2 t = new Teste2();
				t.setVisible(true);
				t.setSize(800, 800);
				frame.setDefaultCloseOperation(TestePrincipal.EXIT_ON_CLOSE);
				frame.setTitle("TestePrincipal");
				frame.getContentPane().setPreferredSize(frame.getSize());
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}

}

Funcionou corretamente como esperava, ou seja posso separar as telas de cadastros etc não deixando tudo no Frame Principal… mas está correto?

Basicamente é isso mesmo. Embora geralmente usemos um filho de JFrame para configurar o comportamento da janela principal.

Obrigado ViniGodoy, entendi sobre como separar as telas.
Agora em relação ao que vc havia dito sobre usar um filho de JFrame para configurar o comportamento da janela principal.

Seria dessa forma:


package br.com.neveline.frame;

import javax.swing.JButton;
import javax.swing.JFrame;


import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

public class FrameComponentes extends JFrame {

	private static final long serialVersionUID = 1L;
	private JButton jButton0;

	public FrameComponentes() {
		initComponents();
	}

	private void initComponents() {
		setLayout(new GroupLayout());
		add(getJButton0(), new Constraints(new Leading(19, 10, 10), new Leading(33, 10, 10)));
		setSize(682, 417);
	}

	private JButton getJButton0() {
		if (jButton0 == null) {
			jButton0 = new JButton();
			jButton0.setText("jButton0");
		}
		return jButton0;
	}

}

package br.com.neveline.frame;

import javax.swing.SwingUtilities;

import org.dyno.visual.swing.layouts.GroupLayout;

public class Principal extends FrameComponentes {

	private static final long serialVersionUID = 1L;
	public Principal() {
		initComponents();
	}

	private void initComponents() {
		setLayout(new GroupLayout());
		setSize(592, 401);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				FrameComponentes frame = new FrameComponentes();
				frame.setDefaultCloseOperation(Principal.EXIT_ON_CLOSE);
				frame.setTitle("Principal");
				frame.getContentPane().setPreferredSize(frame.getSize());
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}

}

Obrigado novamente.

Ou se puder me de algum exemplo.

É mais ou menos isso. Mas muitas configurações você pode fazer diretamente na classe filha, ao invés de usar o main.

package br.com.neveline.frame;

import javax.swing.JButton;
import javax.swing.JFrame;


import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

public class FrameComponentes extends JFrame {

	private static final long serialVersionUID = 1L;
	private JButton jButton0;

	public FrameComponentes() {
		initComponents();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
		setTitle("Principal");                  
		pack();  
		setLocationRelativeTo(null);                  
	}

	private void initComponents() {
		setLayout(new GroupLayout());
		add(getJButton0(), new Constraints(new Leading(19, 10, 10), new Leading(33, 10, 10)));
		setSize(682, 417);
	}

	private JButton getJButton0() {
		if (jButton0 == null) {
			jButton0 = new JButton();
			jButton0.setText("jButton0");
		}
		return jButton0;
	}

}

A única coisa que fica de fora é mesmo o setVisible.

public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new FrameComponentes().setVisible(true); } }); }

obrigado pelo exemplo.

Então a tela principal vai ter apenas o método main?

Você até pode colocar o método main na mesma classe da tela principal, mas geralmente, o corpo do main fica só com esse setVisible aí. :slight_smile:

Seria somente:

public class Principal { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new FrameComponentes().setVisible(true); } }); } }

ah entendi, Muito obrigado.

me esclareceu muito.

Abraços.