Я использую 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);
}
}
При запуске это выглядит так:
На желтом фоне мы видим, что панель редактора занимает все пространство. Вот пример (Photoshopped) того, как я хочу, чтобы макет выглядел так:
Синий фон представляет собой область содержимого, а желтый - панель редактора.
Изменить. В моей рабочей программе в области contentPane
больше, чем просто панель редактора. Вот почему я использую BoxLayout
вместо FlowLayout
для contentPane
; потому что требуется вертикальная компоновка потока страниц.
Просто используйте 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();
}
}
JPanel
соответствовало его наименьшему размеру. Причина, по которой я помещаю JEditorPane
в JPanel
а не просто добавляю его непосредственно на панель прокрутки, заключается в том, что в моей рабочей программе внутри contentPane
больше компонентов, чем просто панели редактора. Возможно, меня смущает то, что я называю JPanel
на панели прокрутки contentPane
, который неоднозначен с « contentPane
контента» верхнего уровня окна.