JEdi​​torPane填充JScrollPane中的所有可用空间

时间:2014-08-31 19:50:44

标签: java swing jscrollpane layout-manager jeditorpane

我在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);
    }
}

运行时,这就是窗口的样子:

Example

在黄色背景下,我们可以看到编辑器窗格占用了所有空间。这是我希望布局看起来像(Photoshop)的示例:

Desired

蓝色背景代表内容窗格,黄色代表编辑器窗格。

编辑:在我的工作程序中,contentPane中不仅有一个编辑器窗格。这就是为BoxLayout使用FlowLayout代替contentPane的原因;因为需要垂直页面流布局。

1 个答案:

答案 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);
    }
}

<强>更新

  

在我的工作程序中,contentPane中不仅仅有一个编辑器窗格。这就是我为contentPane使用BoxLayout而不是FlowLayout的原因;因为需要垂直页面流布局。

BoxLayout就是问题所在。您需要为编辑器窗格设置最大大小。或者只是一起摆脱BoxLayout。 FlowLayout或GridBagLayout将尊重首选大小


更新2

以下是使用GridBagLayout的示例,它可能更适合您的扩展&#34;编辑器。

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