Componentes troca de lugar em linux (melhor entrar para entender melhor)

Olá pessoal!

Estou com uma dúvida… fiz um aplicaçãozinha em java quando usava Windows. Agora que uso linux (Ubuntu 8.10) me assustei ao abrir ela e me deparar com todos os componentes da tela fora do lugar. Eles não mudaram muito de lugar mas o suficiente para deixar feio. Resolvi testar melhor e fiz vários exemplos usando o Windows e ao coloca-los no Linux dá esse pau. Alguém sabe porque acontece isso? :shock: :shock: :shock: :shock:
Ele também trocou todas as letras que contenha acento por um ponto de interrogação (dos componentes da interface).

O Java está instalado corretamente, isso eu já testei, ele roda aplicações com operações só suportadas na nova versão. Por falar em versão, eu uso o 6 update 12

Nesse exemplo meu eu mostro a cagada. As três abas cabiam na mesma linha, o tamanho do painel acaba ultrapassando o tamanho do frame fazendo com que os botões acabem passando do limite, os labels se tornaram pequenos para seu texto, os acentos endoidaram :shock: :shock: :shock: :shock:

Ele tá com um look and fell do Liquid mas eu sei que isso não tem nada a ver com o problema pois usava isso nele no Windows e nunca deu Pau :shock: :shock: :shock:
Achei muito estranho isso ter acontecido.

Obrigado pessoal! :thumbup: :thumbup: :thumbup: :thumbup:

Tive problemas semelhantes, mas não tão graves. Quando executei uma aplicação compilada em Windows XP no Fedora os componentes também sofreram pequenas alterações na posição e nas proporções, mas nada muito drástico (não ficou feio, pelo contrário, até gostei mais hehe).

Você utilizou gerenciadores de layout para estas telas? Desenvolveu as telas no NetBeans (drag and drop) ou no Eclipse?
Tive a impressão que se trata de algum problema com o gerenciador de layout.

Quase certeza que deve ser pelo falo de estar usando o layout como null… tente usar algum gerenciador de layout… faça um teste com GridBagLayout

A utilização de layout null diferencia o modo grafico entre Linux e Windows.

Dependendo do look and fell usado, o null leiaute pode realmente fazer diferença. Outra coisa muito importante é qual JDK está instalada no Linux. Em algumas versões, a OpenJDK já vem instalada, e essa tem uma pequena… chamaria de incompatibilidade, com a JDK da Sun. Isso é fato, uma vez que tenho as duas JDKs instaladas e ao rodar um programa com uma, o resultado é significativamente diferente da outra.

Quanto aos acentos, acontece que os encodings são incompatíveis… enquanto no Linux o padrão é UTF-8, no Windows é Windows-1252 (se não me engano). Em aplicações em inglês, por exemplo, esse tipo de problema não ocorre, visto que, por padrão, não se usam caracteres especiais. A maneira mais simples de se resolver é usar caracteres de escape no lugar de caracteres especiais. Por exemplo, ao invés de fazer:

JButton action = new JButton("Ação");

Faça assim:

JButton action = new JButton("A\u00E7\u00E3o");

Uso layout null. Até entendi sobre colocar um gerenciador de layout mas como fazer um de acordo com minhas necessidades? Pois só conheço layouts prontos. Sobre os acentos como usar esses carácteres de escape? Vocês me recomenda algum tutorial para isso?

A grande vantagem de usar um gerenciador de leiuate é que os prefered sizes dos componentes são respeitados, evitando corte de palavras como ocorreu nos labels, por exemplo.

A API do swing fornece alguns gerenciadores de leiaute muito poderesos, porém seu uso é complexo, principalmente quando se trata de formulários como é o caso. Sugiro que dê uma olhada no FormLayout da JGoodies e procure uns tutoriais de como usar. É bem simples. Outra solução é usar IDEs ou plugins que “fazem o trabalho sujo” para você, como é o caso do NetBeans e do plugin Jigloo para o Eclipse, que facilitam (e muito) a parte do layout.

Quando aos caracteres de escape, deve haver algum programa que converta Strings em códigos Unicode, apesar de eu desconhecer. De qualquer forma, os caracteres especiais podem ser transformados para caracteres de escape manualmente, com uma boa consulta. Existes várias tabelas com os códigos hexadecimais unicode (Latim). Um exemplo aqui. Basta trocar os caracteres por ‘\uXXXX’, sendo XXXX o código hexadecimal. Por exemplo:

String nome = "João";

É o mesmo que:

String nome = "Jo\u00E3o";

Como todos já dissem começe a usar um LayoutManager… no meu caso eu uso o FormLayout do JGoodies.

E sobre acentos… use unicode.

Os acentos eu entendi e já resolvi o problema mas não entendi muito bem esses layouts… alguém me recomenda algum tutorial para que eu possa entender? Mas preciso personalizar o meu layout, afinal não existe um para cada caso.
Obrigado.

Procure sobre o FormLayout… é uma extensão do GridLayout… com uma combinação de Layouts da pra fazer coisas bem legais.

Gente… desculpa a minha ignorância mas não estou entendendo nenhuma explicação de layout que acho na net… :cry: :cry: :cry: :cry:
Pelo menos agora sei bem para que serve um layout mas eu queria criar um próprio, por exemplo:
Como fazer um layout desse?
Estou confuso…


Calma gente… não precisam me mostrar o código fonte prontinho para esse layout, só preciso saber a lógica de construir layouts… :shock: :shock: :shock: :shock: :shock:

gqferreira, o FormsLayout tem um guia de umas 16 páginas, com muitos pedaços de código que ajudam a construir(e entender como montar) o que você quer.
Dá uma procurada no site deles, que você acha.Claro, está em inglês.

Achei esse tutorial e deu certo http://www.devmedia.com.br/articles/viewcomp.asp?comp=6609. Até fiz umas alterações para ver se eu tinha entendido e entendi sim. Mas tem um problema: E quando redimensiono a tela? Não tem como reordenar a grade? Tentei refazer o layout e reaplicar ao painel a partir do evento do botão mas não faz nada apesar de não dar erro de compilação nem exception.
Segue o meu código:

package VE;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class SimpleForm extends JFrame{
	private JButton buttonOk;
	private JLabel labelCPF;
	private JLabel labelDescricao;
	private JLabel labelEndereco;
	private JLabel labelNome;
	private JTextField txtCPF;
	private JTextArea txtDescricao;
	private JTextField txtEndereco;
	private JTextField txtNome;
	private JScrollPane jScrollPane;

	public SimpleForm(){

		this.setTitle("Formulário Simples");
		//super.setTitle("Formulário Simples");

		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		//super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		this.setLayout(new FlowLayout(FlowLayout.LEFT));
		//super.setLayout(new FlowLayout(FlowLayout.LEFT));


		buttonOk = new JButton("Enviar dados >>>");
		labelCPF = new JLabel("CPF:");
		labelDescricao = new JLabel("Descrição:");
		labelNome = new JLabel("Nome:");
		labelEndereco = new JLabel("Endereço:");
		txtCPF = new JTextField(20);
		txtDescricao = new JTextArea(7, 50);
		txtNome = new JTextField(30);
		txtEndereco = new JTextField(30);
		jScrollPane = new JScrollPane(txtDescricao);

		getContentPane().add(getPanelForm());
		//super.add(getPanelForm());

		pack();
		//super.pack();
	}

	public JPanel getPanelForm(){
		FormLayout formLayout = new FormLayout(
				"2dlu, pref, 2dlu, 200, 2dlu, pref, 2dlu, 100px, 2dlu",
		"2dlu, top:pref, 2dlu, top:pref, 2dlu, top:pref, 2dlu, pref, 2dlu" );
		final JPanel jPanel = new JPanel(formLayout);
		jPanel.setBorder(BorderFactory.createTitledBorder("Preencha os dados"));

		CellConstraints cellConstraints = new CellConstraints();
		jPanel.add(labelNome, cellConstraints.xy(2, 2));
		jPanel.add(labelCPF, cellConstraints.xy(6, 2));
		jPanel.add(labelEndereco, cellConstraints.xy(2, 4));
		jPanel.add(labelDescricao, cellConstraints.xy(2, 6));

		jPanel.add(txtNome, cellConstraints.xy(4, 2));
		jPanel.add(txtCPF, cellConstraints.xy(8, 2));
		jPanel.add(txtEndereco, cellConstraints.xyw(4, 4, 5));
		jPanel.add(jScrollPane, cellConstraints.xyw(4, 6, 5));

		jPanel.add(buttonOk, cellConstraints.xy(4, 8));

		buttonOk.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				int v = 400;

				FormLayout formLayout2 = new FormLayout(
						"2dlu, pref, 2dlu, "+v+", 2dlu, pref, 2dlu, 100px, 2dlu",
						"2dlu, top:pref, 2dlu, top:pref, 2dlu, top:pref, 2dlu, pref, 2dlu" );
				System.out.println("Antes");
				jPanel.setLayout(formLayout2);
				System.out.println("Depois");
			}
		});

		return jPanel;
	}

	public static void main(String[] args) {
		try{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

		} catch(Exception e){}

		SimpleForm simpleForm = new SimpleForm();
		simpleForm.setVisible(true);

	}
}

Quando redimensionar a tela?
Experimente tirar o FlowLayout do SimpleForm e trocar a linha 63 do teu código acima por
"2dlu, pref, 2dlu, pref:grow, 2dlu, pref, 2dlu, 100px, 2dlu",

Repare no pref:grow e esqueça a parte do código do botão que “refaz o layout”.

[]'s