Java 在何处插入JScrollPane?

Java 在何处插入JScrollPane?,java,swing,jscrollpane,Java,Swing,Jscrollpane,我使用GridBagLayout制作了一个布局,强制子组件从下到上堆叠 我唯一剩下的就是使容器组件可滚动 我曾尝试在不同的位置插入JScrollPane,但没有找到一个工作点 我的两个内部JPanel在底部正确对齐,当我调整窗口大小时,它们可以正确调整大小。但是,当我调整窗口太小而无法容纳文本时,我希望容器组件滚动 请帮助一个新手: 更新1:滚动条应适用于整个GridBagLayout。不适用于每个单独的文本窗格 更新2:将代码改为使用BorderLayout,因为这对我的滚动问题没有影响 运行

我使用GridBagLayout制作了一个布局,强制子组件从下到上堆叠

我唯一剩下的就是使容器组件可滚动

我曾尝试在不同的位置插入JScrollPane,但没有找到一个工作点

我的两个内部JPanel在底部正确对齐,当我调整窗口大小时,它们可以正确调整大小。但是,当我调整窗口太小而无法容纳文本时,我希望容器组件滚动

请帮助一个新手:

更新1:滚动条应适用于整个GridBagLayout。不适用于每个单独的文本窗格

更新2:将代码改为使用BorderLayout,因为这对我的滚动问题没有影响

运行上述代码时的屏幕截图:

当我缩小窗口时,这些项目当然不适合,然后我希望垂直滚动条出现,但不是水平的,因为文字应该只是换行

如您所见,红色边框在窗口外,因此在此处放置滚动窗格似乎是个好主意。下面是添加了滚动窗格的代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class BorderTest extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new BorderTest().setVisible(true);
        }
    });
}

public BorderTest() {

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Grid Bag");
    setSize(500, 300);
    setLocationRelativeTo(null);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBorder(new LineBorder(Color.CYAN, 2));
    add(scrollPane);

    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());
    container.setBorder(new LineBorder(Color.RED, 2));
    scrollPane.setViewportView(container);

    JPanel innerContainer = new JPanel();
    innerContainer.setLayout(new BorderLayout());
    innerContainer.setBorder(new LineBorder(Color.PINK, 2));
    scrollPane.setViewportView(innerContainer);

    JPanel bottom = new JPanel();
    bottom.setBorder(new LineBorder(Color.YELLOW, 2));
    bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
    innerContainer.add(bottom, BorderLayout.SOUTH);

    JTextPane textPane = new JTextPane();
    textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane.setBorder(new LineBorder(Color.GREEN, 2));
    bottom.add(textPane);

    JTextPane textPane2 = new JTextPane();
    textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane2.setBorder(new LineBorder(Color.BLUE, 2));
    bottom.add(textPane2);

}

}
但结果不是我想要的。现在添加了水平边框,使我的文本项有一个巨大的行宽:

要将JScrollPane添加到组件中,只需使用该组件创建一个JScrollPane,然后将JScrollPane添加到需要该组件的面板中

因此,不是:

panel.add(component, constraints);
使用

当然,您可以使用scrollPane变量稍微定制一下JScrollPane,查看文档,但通过简化将其放入代码中,我们有:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class GridBag extends JFrame
{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new GridBag().setVisible(true);
            }
        });
    }

    public GridBag()
    {

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Grid Bag");
        setSize(500, 300);
        setLocationRelativeTo(null);

        JPanel container = new JPanel(new GridBagLayout());
        container.setBorder(new LineBorder(Color.RED, 2));
        add(container);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.anchor = GridBagConstraints.LAST_LINE_START;

        JPanel bottom = new JPanel();
        bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
        bottom.setBorder(new LineBorder(Color.GREEN, 2));
        container.add(bottom, c);

        JTextPane textPane = new JTextPane();
        textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane.setBorder(new LineBorder(Color.BLACK, 2));
        bottom.add(new JScrollPane(textPane));

        JTextPane textPane2 = new JTextPane();
        textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane2.setBorder(new LineBorder(Color.BLUE, 2));
        bottom.add(new JScrollPane(textPane2));
    }
}
让它看起来像这样:

这很有效,但看起来不是很好,所以让我向您展示一个示例,说明如何使用GridBagConstraints.weight属性进行适当的高度分布

我将要做的是在GridBagLayout中添加两个面板,一个在另一个上添加两个单元格,并使用权重数字告诉它们需要占用多少空间。为此,我想将c填充改为两者

看起来是这样的:

这需要屏幕的一半用于顶部组件,另一半用于两个文本窗格,这是因为topPanel和bottom两个单元格的权重均为1.0,相同的值,因此比例为1:1。您可以更改这些数字以更改它们占用的空间。例如,将第一个权重设置为0.5将使其比例为1:2。

要将JScrollPane添加到组件中,只需使用该组件创建一个JScrollPane,然后将JScrollPane添加到需要该组件的面板中

因此,不是:

panel.add(component, constraints);
使用

当然,您可以使用scrollPane变量稍微定制一下JScrollPane,查看文档,但通过简化将其放入代码中,我们有:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class GridBag extends JFrame
{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new GridBag().setVisible(true);
            }
        });
    }

    public GridBag()
    {

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Grid Bag");
        setSize(500, 300);
        setLocationRelativeTo(null);

        JPanel container = new JPanel(new GridBagLayout());
        container.setBorder(new LineBorder(Color.RED, 2));
        add(container);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.anchor = GridBagConstraints.LAST_LINE_START;

        JPanel bottom = new JPanel();
        bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
        bottom.setBorder(new LineBorder(Color.GREEN, 2));
        container.add(bottom, c);

        JTextPane textPane = new JTextPane();
        textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane.setBorder(new LineBorder(Color.BLACK, 2));
        bottom.add(new JScrollPane(textPane));

        JTextPane textPane2 = new JTextPane();
        textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane2.setBorder(new LineBorder(Color.BLUE, 2));
        bottom.add(new JScrollPane(textPane2));
    }
}
让它看起来像这样:

这很有效,但看起来不是很好,所以让我向您展示一个示例,说明如何使用GridBagConstraints.weight属性进行适当的高度分布

我将要做的是在GridBagLayout中添加两个面板,一个在另一个上添加两个单元格,并使用权重数字告诉它们需要占用多少空间。为此,我想将c填充改为两者

看起来是这样的:


这需要屏幕的一半用于顶部组件,另一半用于两个文本窗格,这是因为topPanel和bottom两个单元格的权重均为1.0,相同的值,因此比例为1:1。您可以更改这些数字以更改它们占用的空间。例如,将第一个权重设置为0.5将使其比例为1:2。

GridBagLayout没有多大作用,因为只有一个组件与该布局一起添加,网格为1x1。我认为你不理解它是如何工作的。为什么要把它放在gridx=0;,gridy=2;?GridBagLayout帮助我将组件从下到上放置,而无需在内部组件上设置固定高度。我只是对在哪里添加JScrollPane有问题。我尝试添加到容器,但没有成功。不,帮助您从下到上放置组件的是带有Y_轴的底部面板的框布局。GridBagLayout一事无成。您可以将这些组件放置在BoirderLayout的南部位置,以实现类似的效果。抱歉,这些都是打字错误。我已经更新了。但是,Y_轴并没有将其置于底部。它只是从上到下堆叠,没有GridBagLayout,这将导致两个面板各有50%的高度,并填充整个高度。将Y_轴更改为X_轴,您将看到JPanel仍然位于底部。这是来自GridBagLayout的帮助。GridBagLayout做的不多,因为您只有1个组件添加了该布局,网格是1x1。我认为你不理解它是如何工作的。为什么要把它放在gridx=0;,gridy=2;?GridBagLayout帮助我将组件放在底部
无需在内部组件上设置固定高度的o形顶部。我只是对在哪里添加JScrollPane有问题。我尝试添加到容器,但没有成功。不,帮助您从下到上放置组件的是带有Y_轴的底部面板的框布局。GridBagLayout一事无成。您可以将这些组件放置在BoirderLayout的南部位置,以实现类似的效果。抱歉,这些都是打字错误。我已经更新了。但是,Y_轴并没有将其置于底部。它只是从上到下堆叠,没有GridBagLayout,这将导致两个面板各有50%的高度,并填充整个高度。将Y_轴更改为X_轴,您将看到JPanel仍然位于底部。这是GridBagLayout的帮助。请注意,我在最后更改了关于权重值的注释,因为它们应该只从0.0变为1.0。请记住,价值观本身并不重要,重要的是它们之间的比例。两个值为1.0,或者两个值为0.5的行为完全相同,只要它们的值大于0.0对不起,但我没有说清楚。我不希望每个组件都有滚动窗格。滚动窗格应该用于红色边框区域的容器。我只会用更多的项目填充底部。不会将其他组件放在内部container@DanieleTesta没有本质区别,容器是一个组件,我告诉过你如何在组件中放置JScrollPanes。因此,我相信您可以找到如何将它放在那里而不是JTextPanes中,但是如果我将滚动窗格放在容器之前或容器内部,文本窗格将不再进行文字包装。相反,它们变成了一条巨大的可滚动的宽行。我将添加屏幕截图以向您展示。@DanieleTesla解决此问题的丑陋方法是手动设置最大/首选大小。正确的方法是使用不占用尽可能多空间的布局。您不想使用fill=水平/两者。我脑子里不知道所有这样的布局,但快速的谷歌搜索给出了几个候选。另外,我也不知道如果你不打算放置更多的组件,为什么要制作所有这些布局结构。请注意,我在最后更改了关于权重值的注释,因为它们应该只从0.0变为1.0。请记住,价值观本身并不重要,重要的是它们之间的比例。两个值为1.0,或者两个值为0.5的行为完全相同,只要它们的值大于0.0对不起,但我没有说清楚。我不希望每个组件都有滚动窗格。滚动窗格应该用于红色边框区域的容器。我只会用更多的项目填充底部。不会将其他组件放在内部container@DanieleTesta没有本质区别,容器是一个组件,我告诉过你如何在组件中放置JScrollPanes。因此,我相信您可以找到如何将它放在那里而不是JTextPanes中,但是如果我将滚动窗格放在容器之前或容器内部,文本窗格将不再进行文字包装。相反,它们变成了一条巨大的可滚动的宽行。我将添加屏幕截图以向您展示。@DanieleTesla解决此问题的丑陋方法是手动设置最大/首选大小。正确的方法是使用不占用尽可能多空间的布局。您不想使用fill=水平/两者。我脑子里不知道所有这样的布局,但快速的谷歌搜索给出了几个候选。我也不知道,如果你不打算放置更多的组件,为什么要制作所有这些布局结构。
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class GridBag extends JFrame
{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new GridBag().setVisible(true);
            }
        });
    }

    public GridBag()
    {

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("Grid Bag");
        setSize(500, 300);
        setLocationRelativeTo(null);

        JPanel container = new JPanel(new GridBagLayout());
        container.setBorder(new LineBorder(Color.RED, 2));
        add(container);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH; //make it fill both directions
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1.0;
        c.weighty = 1.0; //modify this number to change the proportion of the screen division
        c.anchor = GridBagConstraints.CENTER; //for this example anything here goes.

        JPanel topPanel = new JPanel();
        topPanel.add(new JTextField("Put other components here"));
        //topPanel.setBorder(new LineBorder(Color.YELLOW, 2));
        container.add(topPanel, c);

        c.gridy = 1;
        c.weighty = 1.0; //modify this number to change the proportion of the screen division

        JPanel bottom = new JPanel();
        bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
        bottom.setBorder(new LineBorder(Color.GREEN, 2));
        container.add(bottom, c);

        JTextPane textPane = new JTextPane();
        textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane.setBorder(new LineBorder(Color.BLACK, 2));
        bottom.add(new JScrollPane(textPane));

        JTextPane textPane2 = new JTextPane();
        textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane2.setBorder(new LineBorder(Color.BLUE, 2));
        bottom.add(new JScrollPane(textPane2));
    }
}