JTextPane + JPanel + JScrollPane (RESOLVIDO)

2 respostas
P

Tarde a todos.

Estou com um problemasso que aparentemente parece ser simples, mas está me atrasando bastante no desenvolvimento de um Formulário de Questões para um sistema de auxio a decisão.

[Situação]
Eu estou montando um questionário dinâmicamente com a seguinte estrutura:
Um JScrollPane como conteiner de um JPanel (utilizando GridBagLayout) para servir de conteiner de vários JTextPane não editável (que conteram as questões) e em baixo de cada JTextPane um painel de radios com as opções.

Eu quero que o questionário (JTextPane) se auto ajustem ao redimencionar horizontalmente, ou seja, apliquei a JScrollPane a politica: HORIZONTAL_SCROLLBAR_NEVER. Assim o texto se autoformatará de acordo com a disposição da tela (recurso somente disponivel no JEditorPane e JTextPane).

[Problema]
Quando uso um conteiner a mais (no caso a JPanel para criar meu proprio layout do questionário), o componente JTextPane não ajusta o seu conteúdo, ou seja, ele chega a redimencionar horizoltamente, mas quando chega no seu minimo, o texto que deveria ser ajustada para baixo, fica para fora da tela.

[Código exemplo]

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;


public class Teste {

	public Teste() {
		naoFunciona();
		funciona();
	}
	
	private void naoFunciona() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setTitle("Nao funciona");
		frame.setSize(400,200);
		
		JTextPane editor = new JTextPane();
		editor.setText("aaaaaa asd asd asdasdadad asd as");
		editor.setEditable(false);
		
		JPanel panel = new JPanel(new GridBagLayout());
		
		GridBagConstraints g = new GridBagConstraints();
		g.fill = GridBagConstraints.HORIZONTAL;
		g.gridx = 0;
		g.gridy = 0;
		g.weightx = 1;
		panel.add(editor, g);
		
		JScrollPane scroll = new JScrollPane(panel);
		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

		frame.add(scroll, BorderLayout.CENTER);
		frame.setVisible(true);
	}
	
	private void funciona() {
		JFrame frame = new JFrame();
		frame.setTitle("Funciona");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.setSize(400,200);
		
		JTextPane editor = new JTextPane();
		editor.setText("aaaaaa asd asd asdasdadad asd as");
		editor.setEditable(false);
		
		JScrollPane scroll = new JScrollPane(editor);
		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

		frame.add(scroll, BorderLayout.CENTER);
		frame.setVisible(true);
	}
	
	public static void main(String[] args) {
		new Teste();
	}

}

Obrigado

2 Respostas

P

É, parece-me que a única solução (desse exemplo) é setar o PreferredSize do JPanel dessa forma:

panel.setPreferredSize(new Dimension(0, panel.getHeight()));

Detalhe. Como há um componente interno que irá alterar seu tamanho (no caso, aumentar a height), provavelmente a solução é atualizar o PreferredSize toda vez que houver um redimencionamento da tela.

Mas ainda não me ajuda muito.
Aguardo novas idéias…

P

[Solução]

Quebrando um pouco a cabeça, acho que cheguei a uma solução compativel com a minha necessidade.
Acabei criando um ComponentListener para o meu painel onde no método de captura de resize, ele altera o próprio
PreferredSize.

Criado 23 de novembro de 2009
Ultima resposta 24 de nov. de 2009
Respostas 2
Participantes 1