Как определить максимальную ширину, которую получит Java-компонент для запроса правильной высоты? - PullRequest
2 голосов
/ 26 августа 2011

Я создаю пользовательский компонент Java для Amazon Kindle KDK на основе личного профиля Java 1.4.2. Компонент будет содержать текст, который при необходимости будет перекомпонован в несколько строк. Я хочу запросить размер, используя методы getMinimumSize(), getPreferredSize() и getMaximumSize(), которые будут точно содержать текст. Мне нужно будет запросить точную высоту, необходимую на основе ширины, которую компонент получит во время компоновки.

Например, если компонент получит ширину, достаточную для размещения всего текста в одной строке, он будет запрашивать только высоту в одну строку. Но если он получит только ширину, достаточную для размещения текста на трех строках, то он запросит высоту, которая позволит разместить три строки текста.

Кажется, мне нужно сделать макет за два прохода, первый запросить столько ширины, сколько нужно, чтобы уместить текст в одну строку. Затем, как только он получит разрешенную величину ширины, запросите величину высоты для размещения текста в несколько строк, если это необходимо. Как лучше всего узнать, какой будет эта ширина, чтобы получить правильные значения Dimension в getMinimumSize(), getPreferredSize() и getMaximumSize()?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я бы с удовольствием использовал JTextArea, но PBP не имеет каких-либо размах и ограниченные компоненты AWT. Kindle KDK сам имеет несколько основных компонентов, включая KTextArea и KLabelMultiline. Проблема в том, что оба они очень глючные и не имеют правильного размера в ситуациях с гибкой компоновкой. Они отлично работают с фиксированными макетами, где все имеет фиксированную область для использования. Но при размещении их в макете, который содержит элементы склеивания и другие текстовые компоненты, которые могут иметь переменные размеры, они не расширяются должным образом для отображения всего своего текста, и эту проблему я пытаюсь решить с помощью пользовательского компонента.

1 Ответ

1 голос
/ 26 августа 2011

Может быть, просто используйте 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 , который лучше демонстрирует, что вы пытаетесь сделать, чтобы мы могли видеть проблемы, которые у вас возникают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...