JEditorPane, заполняющий все доступное пространство в JScrollPane

1

Я использую JEditorPane внутри JPanel который я назвал своей contentPane в приведенном ниже примере. Область содержимого находится внутри JScrollPane. Я бы хотел, чтобы панель редактора заполнила как можно меньше места (просто чтобы содержать текст), а остальная часть пространства, доступного на панели содержимого, оставлена пустой донизу и с обеих сторон. Если текст становится слишком большим, область редактора будет расти, и в итоге панель прокрутки создаст полосы прокрутки для просмотра всего содержимого. Однако вместо панели редактора, занимающей только предпочтительный размер (который представляет собой размер содержащегося в нем текста), он заполняет всю область содержимого, которая заполняет весь порт представления области прокрутки. Вот пример кода для демонстрации моей проблемы:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BoxLayout;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class ScrollPaneExample extends JFrame {
    public static void main(String[] args) {
        new ScrollPaneExample();
    }
    public ScrollPaneExample() {
        super("ScrollPaneExample");

        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        JEditorPane editorPane = new JEditorPane("text/plain", "");
        editorPane.setBackground(Color.YELLOW);

        for (int i = 0; i < 5; i++)
            editorPane.setText(editorPane.getText() + "Hello World\n");

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
        contentPane.setBackground(Color.BLUE);
        contentPane.add(editorPane);

        JScrollPane scrollPane = new JScrollPane(contentPane);

        add(scrollPane, BorderLayout.CENTER);

        setVisible(true);
    }
}

При запуске это выглядит так:

Изображение 174551

На желтом фоне мы видим, что панель редактора занимает все пространство. Вот пример (Photoshopped) того, как я хочу, чтобы макет выглядел так:

Изображение 174551

Синий фон представляет собой область содержимого, а желтый - панель редактора.

Изменить. В моей рабочей программе в области contentPane больше, чем просто панель редактора. Вот почему я использую BoxLayout вместо FlowLayout для contentPane; потому что требуется вертикальная компоновка потока страниц.

  • 0
    Как определить размер? Вы хотите, чтобы это был точный размер? Вы хотите определенный размер? Хотите ли вы его размер на основе динамического текста?
  • 0
    @peeskillet Панель редактора должна динамически изменять размер в зависимости от текста. Чтобы соответствовать любому тексту вводится.
Показать ещё 1 комментарий
Теги:
swing
layout-manager
jeditorpane
jscrollpane

1 ответ

3
Лучший ответ

Просто используйте FlowLayout для области содержимого. BorderLayout не будет уважать предпочтительный размер и растянет компонент, чтобы он соответствовал. Узнайте больше о менеджерах компоновки при компоновке компонентов с контейнером

Если вы хотите установить начальный размер для панели редактора, как и любой другой компонент Scollable, вы можете переопределить getPreferredScrollableViewportSize() чтобы установить размер для окна панели прокрутки (когда компонент добавлен)

Также вы должны добавить редактор на панель прокрутки, а не на панель. Выполняя последнее, редактор не будет прокручиваться в панели прокрутки.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

@SuppressWarnings("serial")
public class ScrollPaneDemo extends JFrame {
    public static void main(String[] args) {
        new ScrollPaneDemo();
    }

    public ScrollPaneDemo() {
        super("ScrollPaneExample");

        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        JEditorPane editorPane = new JEditorPane("text/plain", "") {
            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(200, 200);
            }
        };
        editorPane.setBackground(Color.YELLOW);

        for (int i = 0; i < 50; i++) {
            editorPane.setText(editorPane.getText()
                    + "Hello World Hello World\n");
        }

        JScrollPane scrollPane = new JScrollPane(editorPane);

        add(scrollPane);

        setVisible(true);
    }
}

ОБНОВИТЬ

В моей рабочей программе в ContentPane имеется больше, чем просто панель редактора. Вот почему я использую BoxLayout вместо FlowLayout для contentPane; потому что требуется вертикальная компоновка потока страниц.

Проблема BoxLayout. Вы должны установить максимальный размер для панели редактора. Или просто избавитесь от BoxLayout все вместе. FlowLayout или GridBagLayout будут уважать предпочтительный размер


ОБНОВЛЕНИЕ 2

Вот пример использования GridBagLayout, который может быть более подходящим для вашего "расширяющегося" редактора.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class ScrollPaneExample extends JFrame {
    public static void main(String[] args) {
        new ScrollPaneExample();
    }
    public ScrollPaneExample() {
        super("ScrollPaneExample");

        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        //getContentPane().setBackground(Color.BLUE);

        final JEditorPane editorPane = new JEditorPane("text/plain", "") {
        };

        editorPane.setBackground(Color.YELLOW);

        for (int i = 0; i < 5; i++)
            editorPane.setText(editorPane.getText() + "Hello World\n");

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weighty = 1;
        contentPane.setBackground(Color.BLUE);
        contentPane.add(editorPane, gbc);

        gbc.gridy++;
        contentPane.add(new JButton("Button"), gbc);
        gbc.gridy++;
        contentPane.add(new JButton("Button"), gbc);

        JPanel panel = new JPanel();
        panel.add(contentPane);
        JScrollPane scrollPane = new JScrollPane(panel);

        add(scrollPane);

        setVisible(true);

        Timer timer = new Timer(1000, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                editorPane.setText(editorPane.getText() + "Hello World\n");
                setVisible(true);
            }
        });
        timer.start();
    }
}

Изображение 174551

  • 0
    Вы меня неправильно поняли. В моем примере панель прокрутки на самом деле не имеет значения. Я хотел бы, чтобы панель прокрутки заполняла все окно (400x400), но содержимое ВНУТРИ JPanel соответствовало его наименьшему размеру. Причина, по которой я помещаю JEditorPane в JPanel а не просто добавляю его непосредственно на панель прокрутки, заключается в том, что в моей рабочей программе внутри contentPane больше компонентов, чем просто панели редактора. Возможно, меня смущает то, что я называю JPanel на панели прокрутки contentPane , который неоднозначен с « contentPane контента» верхнего уровня окна.
  • 0
    Попался. BoxLayout является проблемой. Вам нужно установить максимальный размер для панели редактора. Или просто избавиться от BoxLayout все вместе. FlowLayout или GridBagLayout будут учитывать предпочтительный размер
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню