Swing se comportando de forma... estranha

4 respostas
P

E ai galera,

Acontece o seguinte. Tava analisando o algoritmo de validação de CPFs e criei um validadorzinho besta aqui, contendo 1 JFormattedTextField, 2 JButton(testar e sair). Todos os componentes são gerados em classes separadas mas tem um método que retorna tal componente pra classe principal. (JButtonSair.java, JButtonAceitar.java, etc).

Mas as vezes, quando mando compilar o projeto no Eclipse, o JFormattedTextField acaba preenchendo todo o JFrame. Mas só as vezes, isso que é estranho. Estou com o projeto em um PenDrive compilando.

E outro problema, é que quando dou setResizeable(false); ele gera o JFrame mas nao aparece nenhum componente, creio que é porque o JFrame é redimensionado, mas gostaria de saber porquê.

O código está um lixo porquê eu estou só brincando com isso ainda.

Aí vai uns trechos de código:

Método construtor da GUI:

public ShitTest(boolean Visible){
		setTitle("CPF Verifier");
		add(cpf.GerarCampo());
		setBackground(Color.BLACK);
		setVisible(Visible);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(350, 70);
		setLayout(new FlowLayout());
		add(BtTestar.RetornarBotaoTestar());
		add(BtSair.RetornarBotaoSair());
}

Codigo do JFormattedTextField:

JFormattedTextField JFCpf = new JFormattedTextField(gerarMascara());
	//Construtor...
	public CampoCpf(){		
		Graphics();
	}

	private void Graphics() {
		JFCpf.setColumns(10);
		JFCpf.addFocusListener(new FocusListener() {
			public void focusLost(FocusEvent f) {
				JFCpf.setBackground(Color.white);
			}

			public void focusGained(FocusEvent f) {
				JFCpf.setBackground(Color.yellow.darker());
			}

		});
	}

	public JFormattedTextField GerarCampo() {
		Graphics();
		return JFCpf;
	}

	protected MaskFormatter gerarMascara() {
		MaskFormatter mascara = new MaskFormatter();
		try {
			mascara.setMask("###.###.###-##");
			mascara.setPlaceholderCharacter('_');
			mascara.setValidCharacters("[telefone removido]");
			mascara.setOverwriteMode(true);
		} catch (Exception excecao) {
			excecao.printStackTrace();
		}
		return mascara;
	}

}

O que tá acontecendo?

Valeu!

4 Respostas

T

Use o MigLayout ( http://www.miglayout.com ) e seja feliz!

De modo geral, são poucos os layouts que vêm com o JDK que são úteis. Se é para construir um formulário (que normalmente é o que você precisa fazer no dia-a-dia), o MigLayout é perfeito para isso. Acho que dá menos dor de cabeça, por exemplo, que o tal do NetBeans Matisse (javax.swing.layout.GroupLayout). Acho que o Matisse é bom só para fazer aqueles protótipos que usam o LAF “Napkin” - é difícil fazer com que o editor gráfico do NetBeans deixe as coisas do jeito que você precisa.

P

Opa thingol,

Obrigadão pela dica. Mas deixa eu te perguntar uma coisa: Se eu fosse trabalhar em uma fábrica de software que não usa miglayout, o manager vai exigir que eu faça usando os layouts padrões ou ele não vai encher o saco com isso?

Valeu!

B

thingol:
Use o MigLayout ( http://www.miglayout.com ) e seja feliz!

De modo geral, são poucos os layouts que vêm com o JDK que são úteis. Se é para construir um formulário (que normalmente é o que você precisa fazer no dia-a-dia), o MigLayout é perfeito para isso. Acho que dá menos dor de cabeça, por exemplo, que o tal do NetBeans Matisse (javax.swing.layout.GroupLayout). Acho que o Matisse é bom só para fazer aqueles protótipos que usam o LAF “Napkin” - é difícil fazer com que o editor gráfico do NetBeans deixe as coisas do jeito que você precisa.


Ola,

O GridBagLayout, que é, eu diria, a base para estes “frameworks” de layout manager é MUITO util, vale a pena gastar um tempo e aprender a usar… e dizer que os que "são poucos os layouts que vêm com o JDK que são úteis. " é uma injustiça.

Bom, em relação a questão é a seguinte, considerando que a classe ShitTest seja uma extenção de um JFrame, ou JDialog, o contentPane destes componentes usam por default o layout BorderLayout, então se vc adiciona algo nele, sem dizer onde, ele vai para o CENTER, o que por comportamento do layout, se não tiver nada nas bordas, vai ocupar todo o espaço.

Solução, cria um JPanel, que o layout default é o FlowLayout, com constante de centralizar os componentes, e adicione os componetes, textos, botões, neste panel, depois vc adiciona este panel a sua janela principal… e seja feliz.

T

Se você for trabalhar em uma fábrica de software, normalmente elas usam null layout (ou seja, posicionamento absoluto) porque precisam de produtividade.

Criado 20 de junho de 2008
Ultima resposta 20 de jun. de 2008
Respostas 4
Participantes 3