Как определить максимальную ширину, которую получит Java-компонент для запроса правильной высоты?
Я создаю пользовательский компонент Java для Amazon Kindle KDK на основе личного профиля Java 1.4.2. Компонент будет содержать текст, который при необходимости будет перекомпонован в несколько строк. Я хочу запросить размер, используя getMinimumSize()
, getPreferredSize()
а также getMaximumSize()
методы, которые будут содержать текст точно. Мне нужно будет запросить точную высоту, необходимую на основе ширины, которую компонент получит во время компоновки.
Например, если компонент получит ширину, достаточную для размещения всего текста в одной строке, он будет запрашивать только высоту в одну строку. Но если он получит только ширину, достаточную для размещения текста на трех строках, то он запросит высоту, которая позволит разместить три строки текста.
Кажется, мне нужно сделать макет за два прохода, первый из которых запрашивает столько ширины, сколько нужно, чтобы уместить текст в одну строку. Затем, как только он получит разрешенную величину ширины, запросите величину высоты для размещения текста в несколько строк, если это необходимо. Каков наилучший способ узнать, какой будет эта ширина, чтобы вернуть правильную Dimension
в getMinimumSize()
, getPreferredSize()
а также getMaximumSize()
?
РЕДАКТИРОВАТЬ: Чтобы уточнить, я бы с удовольствием использовал JTextArea
, но у PBP нет никаких колебаний и ограниченных компонентов AWT. Kindle KDK сам имеет несколько основных компонентов, включая KTextArea и KLabelMultiline. Проблема в том, что оба они очень глючные и не имеют правильного размера в ситуациях с гибким макетом. Они отлично работают с фиксированными макетами, где все имеет фиксированную область для использования. Но при размещении их в макете, который содержит элементы склеивания и другие текстовые компоненты, которые могут иметь переменные размеры, они не расширяются должным образом для отображения всего своего текста, и эту проблему я пытаюсь решить с помощью пользовательского компонента.
1 ответ
Может быть, просто используйте JTextArea для отображения текста.
import java.awt.*;
import javax.swing.*;
public class TextAreaHeight extends JFrame
{
public TextAreaHeight()
{
JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
add(textArea, BorderLayout.NORTH);
JPanel center = new JPanel();
center.setBackground(Color.ORANGE);
add(center, BorderLayout.CENTER);
setSize(200, 200);
setLocationRelativeTo( null );
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args)
{
new TextAreaHeight();
}
}
Если это решение слишком простое, тогда опубликуйте SSCCE, который лучше демонстрирует, что вы пытаетесь сделать, чтобы мы могли видеть проблемы, которые у вас возникают.