2014-08-31 3 views
1

Я использую JEditorPane внутри JPanel, который я назвал своим contentPane в приведенном ниже примере. Область содержимого находится внутри JScrollPane. Я бы хотел, чтобы панель редактора заполнила как можно меньше места (просто чтобы содержать текст), а остальная часть пространства, доступного на панели содержимого, оставлена ​​пустой донизу и с обеих сторон. Если текст становится слишком большим, область редактора будет расти, и в итоге панель прокрутки создаст полосы прокрутки для просмотра всего содержимого. Однако вместо панели редактора, занимающей только предпочтительный размер (который представляет собой размер содержащегося в нем текста), он заполняет всю область содержимого, которая заполняет весь порт представления области прокрутки. Вот пример кода, чтобы продемонстрировать мою проблему:JEditorPane заполняет все свободное пространство в 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); 
    } 
} 

При запуске, это то, что окно выглядит следующим образом:

Example

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

Desired

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

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

+0

Как размер будет определяться? Вы хотите, чтобы этот точный размер (что означает, что он соответствует пяти мирам приветствия)? Вы хотите, чтобы он был определенного размера? Вы хотите, чтобы размер был основан на динамическом тексте? –

+0

@peeskillet Панель редактора должна динамически изменять размер на основе текста. Для ввода любого текста. –

+0

Вы хотите, чтобы вид в области прокрутки был динамически изменен (так что в целом вся панель прокрутки - какая-то победа над областью прокрутки)? Или вид остаться, но свитки добавлены? В последнем случае, что определить начальный размер, содержание пяти миров приветствия? –

ответ

3

Просто используйте FlowLayout для области содержимого. BorderLayout не будет уважать предпочтительный размер и растянуть компонент в соответствии. Подробнее о компоновщиках на Laying out Components Withing a Container

Если вы хотите установить начальный размер для панели редактора, так же, как с любым другим компонентом, который является 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); 
    } 
} 

UPDATE

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

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


UPDATE 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(); 
    } 
} 

enter image description here

+0

Вы меня неправильно поняли. В моем примере панель прокрутки фактически не имеет значения. Я хотел бы, чтобы панель прокрутки заполняла все окно (400x400), но содержимое ВСТАВЛЯЛО «JPanel» к самому маленькому размеру. Причина, по которой я помещаю 'JEditorPane' внутри' JPanel' вместо того, чтобы просто добавлять его в панель прокрутки напрямую, заключается в том, что в моей рабочей программе в 'contentPane' больше компонентов, чем в области редактора. Возможно, я сбила с толку мое обращение к «JPanel» внутри панели прокрутки «contentPane», которая неоднозначна с «областью содержимого» верхнего уровня окна. –

+0

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

+0

. Установка максимального размера панели редактора в качестве предпочтительного размера - это то, как я сначала решил решить проблему. Проблема здесь в том, что когда в область редактора добавляется больше текста, его предпочтительный размер будет автоматически изменяться, но его максимальный размер не будет. И добавление 'ComponentListener' не работает, поскольку оно только слушает изменение размера, а не предпочтительный размер. См. Мой редактор, почему «BoxLayout» является желательным. Возможно, «GridBagLayout» может быть решением, я посмотрю. –

Смежные вопросы