Projeto SWING

Bem Pessoal,estou começando um projeto Swing.
E ele é bastante simples.
Ele deve comparar dois arquivos e relatar as divergencias entre eles.
Cada arquivo representa uma contagem,e o relatorio de divergencias deve conter a diferenca,do que foi contada na primeira contagem e na segunda.
O projeto em si,é super simples.
As duvidas são em relação a forma como projetar isso.
Exemplo.
Criar uma classe que extende de JFrame ou usar um objeto Jframe?
Botões como atributos da classe ou cada botão extend de JButton implements ActionListener?Como Organizar isso?
Alguem poderia me ajudar,pois nunca projetei algo em swing.
E eestou com algumas duvidas.
Grato.

Depende de como vc pensa em montar o projeto.
Eu estou desenvolvendo um para a empresa e uso uma classe PADRAO que extende de um JInternalFrame e todas as outras telas extendem desse padrao. Sendo uma tela principal, uma classe unica que extende de JFrame.
Os botoes, cada um extende de um JButton ou de um Botao padrao a qual eu crio.
Bom… uso assim! Se puder exclarecer um pokim ou descartar. So mesmo para ver como eu faço para vc ter uma ideia tbm.

Abraço! :wink:

a) Estenda JFrame; use o mínimo de objetos JFrame possíveis.
b) De preferência use classes derivadas de JPanel e JDialog. (Não há uma coisa chamada de “JFrame modal” - para isso use uma classe derivada de JDialog)
c) Eu prefiro criar uma classe para meu projeto que estende JButton mas já tem as devidas personalizações (digamos tipo de fonte, cor das letras, fundo, bordas etc.), em vez de usar um JButton com casca e tudo e ficar setando as propriedades manualmente para cada um :stuck_out_tongue: - está certo que o NetBeans ajuda nisso, já que posso adicionar essas classes que estendem JButton na palette.
No entanto, quanto ao ActionListener, é melhor criar sempre uma anonymous inner class que estende ActionListener e adicionar ao botão. Melhor ainda, crie uma Action, que pode representar a mesma ação no botão ou como item do menu, ou então como shortcut de teclado.

Humm…Calma gente.
Como disse anteriormente não é algo grande.
É um pequeno,pequeno mesmo,projeto.4 botões,cada um com uma action diferente…Só que ainda não sei como faz isso no swing “da melhor maneira”.
Queria ,embora seja pequeno,usar boas práticas,caso eu precise expandir ele futuramente.

[code]package aplicacao.gui;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Gui extends JFrame{

public Gui() {
	super("SCC - Sistema de Comparação de Contagem");
	JPanel panel = new JPanel();
	panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
	
	JButton merge = new JButton("Fazer merge dos arquivos");
	JButton comparar = new JButton("Comparar contagens");
	JButton relatorio = new JButton("Gerar relatório por setor");
	JButton sair = new JButton("Sair");
	
	panel.add(merge);
	panel.add(comparar);
	panel.add(relatorio);
	panel.add(sair);
	
	getContentPane().add(panel);
	
	setVisible(true);
	setSize(400,300);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
	
	new Gui();
	
}

}
[/code]

Eu queria entender porque não aparece o button no meu frame.
Alguem?

Maximiza sua tela e depois restaura. Vera que vai aparecer.
Estou vendo porque esta ocorrendo isso ainda.
O BoxLayout esta pegando como se a janela se inicializasse maximizada, entao ele joga la em cima. Copreendeu?! Estou vendo uma maneira para tirar isso, pois nunca usei BoxLayout.

abraço!

Utilizei o método pack(); E agora aparece somente os botões como eu quero.
Bem ,e agora?Eu como devo implementar a Ação de cada botão?Só vai ter ação no onclick de cada botão.
Qual a melhor maneira de implementar isso?
Não estou usando netbeans,porque quero aprender na mão grande,como funciona.

açao em botao.

nomeBotao.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent evt){ //ação desejada } });

abraço!

Isso deve ser feito no construtor?

sim. Declare o objeto e logo abaixo faça isso. Assim sera facil localizar e ver tudo a respeito do objeto. Ou entao organize como achar melhor dentro do seu constructor.

Só um observação: na verdade eu prefiro extender JPanel no lugar do JFrame e depois adicionar o JPanel em um frame. Isto deixa a aplicação mais flexíve para você poder adicionar o JPanel em outros tipos de container de componentes como outro JPanel ou um JDialog.

Não tinha pensado dessa forma.
Valeu pelo toque Guerra. :smiley:

Posso ter mais de um panel,em um frame?
Meu problema atualmente é que tenho 4 botões.E em um botão,eu preciso exibir um JTable com uma tabela de 3 colunas e n linhas…
Só que eu queria fazer isso,sem "esconder os outros botões"
Alguem me orienta,como?

Pessoal,não sei se é uma boa prática postar códigos grandes,mas…
Queria que avaliassem o que eu fiz.
E fizesse criticas ou sugestões de melhorias.

package aplicacao.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import aplicacao.bussiness.Operacao;

public class Gui extends JFrame {

	private static JFileChooser filesChooser;
	public Gui() {
		super("SCC - Sistema de Comparação de Contagem");
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

		JButton merge = new JButton("Gerar arquivo único para contagem");
		merge.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {

				try {
					JFileChooser fileChooser = Gui.fileChooser();
						int status = fileChooser.showOpenDialog(null);
					if (status == JFileChooser.APPROVE_OPTION) {

						File selectedFiles[] = fileChooser.getSelectedFiles();
						Operacao.mergeArquivos(selectedFiles);
					}

				} catch (IOException e) {

					System.out.println(e.getMessage());
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
			}
		});

		JButton cancelarComparacao = new JButton("Cancelar comparação");
		cancelarComparacao.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {
				
				Operacao.cancelaComparacao();
			}
		});

		JButton comparar = new JButton("Comparar contagens");
		comparar.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {

				JTable jTable = new JTable();
				jTable
						.setModel(new DefaultTableModel(new Object[][] {},
								new String[] { "Referência", "Contagem 1",
										"Contagem 2" }));

				Operacao.configuraJTable(jTable);
				JScrollPane scrollPane = new JScrollPane(jTable);
				JPanel panelTable = new JPanel();
				panelTable.add(scrollPane);
				getContentPane().add(panelTable, BorderLayout.SOUTH);
				pack();
				setVisible(true);

			}

		});

		JButton relatorio = new JButton("Gerar relatório por setor");
		relatorio.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {

			}
		});

		JButton sair = new JButton("Sair");
		sair.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {

				System.exit(0);
			}
		});

		panel.add(cancelarComparacao);
		panel.add(merge);
		panel.add(comparar);
		panel.add(relatorio);
		panel.add(sair);

		getContentPane().add(panel);

		setVisible(true);
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private static JFileChooser fileChooser(){
		
		if(filesChooser == null){
			filesChooser = new JFileChooser(".");
				filesChooser.setMultiSelectionEnabled(true);
				filesChooser
						.setCurrentDirectory(new File(
								"C:\\Arquivos de programas\\Recebe\\CFG_NOVA\\SAIDA"));
				filesChooser.setBackground(Color.blue);
				filesChooser.setForeground(Color.red);	
		}
		
		return filesChooser;
					
	}
	public static void main(String[] args) {

		new Gui();

	}
}

Explicando oq eu fiz,eu criei um atributo static FileChooser ,porque percebi que vou precisar na maoria do programa de uma chamada a um objeto desse,ai criei algo que lembra um Factory de file chooser(me corrijam se eu estiver errado)…E cada botao,como podem perceber,tem sua respectiva Operacao.
Operacoa é uma classe onde concentrei toda minha logica de negocio.
O programa,tem 2 classes…
Muito mini,porem, queria que ficasse o melhor projetado possivel,porque quero fazer ele o melhor elaborado possivel,para em caso de expancsao e aceitacao eu poder ofertar como algo profissional de qualidade.
Grato pela ajuda!

Claro! Um panel é um componente como qualquer outro, como um botão ou um textfield. Você pode ter até vários panels dentro de um panel. Para posiciona-los você utiliza o layout manager da forma que você faria com qualquer outro componente.

Guera,pelo que vi sobre voce,voce conhece bastante swing…
Vou acabar minha classe aqui e vou enviar para voce dar uma analisada ou ate mesmo outros participantes,so em termo de qualidade e de metodologia,uso correto ou nao…nao avaliar logica…etc…avaliar,qualidade.
Eu reprojetei,dividindo a classe Operacao em mais 2…Util que trata de tratamento auxiliares e UtilIO que trata de chaamdas IO.