java - 在哪里插入 JScrollPane?

标签 java swing jscrollpane

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

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

我试过将 JScrollPane 插入不同的位置,但我找不到工作点。

我的 2 个内部 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);

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

    JPanel bottom = new JPanel();
    bottom.setBorder(new LineBorder(Color.YELLOW, 2));
    bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
    container.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);

}

}

运行上述代码时的截图:

enter image description here

当我缩小窗口时,项目不适合(当然)然后我希望出现垂直滚动条(但不是水平滚动条,因为单词应该换行)

enter image description here

如您所见,“红色”边框位于窗口的“外部”,因此在此处放置一个滚动 Pane 似乎是个好主意。这是添加了滚动 Pane 的代码:

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);

}

}

但是结果并不是我想要的。现在添加了水平滚动条,使我的文本项成为一大行宽:

enter image description here

最佳答案

要将 JScrollPane 添加到组件,您只需使用该组件创建一个 JScrollPane,然后将 JScrollPane 添加到面板你想要组件的地方。

所以代替:

panel.add(component, constraints);

使用

JScrollPane scrollPane = new JScrollPane(component);
panel.add(scrollPane, 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));
    }
}

让它看起来像这样:

enter image description here

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

我要做的是将两个面板添加到 GridBagLayout(2 个单元格),一个放在另一个上面,并使用 weighty 数字告诉它们有多少空间采取。为此,我想将 c.fill 更改为 BOTH

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

看起来像这样:

enter image description here

顶部组件占屏幕的一半,两个文本面板占屏幕的一半,这是因为两个单元格(topPanelbottom) 是1.0,同样的值,所以比例是1:1。您可以更改这些数字以更改它们占用的空间。例如将第一个权重设置为 0.5 将使其比例为 1:2。

关于java - 在哪里插入 JScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22422806/

相关文章:

java - BitSet 向后显示值?

java - 从列表中删除项目而不是从 RecyclerView 中删除它们?

java - 在 Java Spring Hibernate 中连接多个表

java - 具有两个 toString 方法的自定义 JCombobox 模型

java - 在运行时更改面板的高度

Java JTable 复制行时出错

java - 停止在 BoxLayout 中扩展 JScrollPane

javascript - 通过 ajax 使用自定义滚动条向元素添加内容

java - Stripes 框架 - 上下文返回 null

java - 如何将 JScrollPane 添加到此 JTextArea?