当前位置: 首页 > 面试题库 >

JScrollPane内JPanel上的JTextArea无法正确调整大小

危裕
2023-03-14
问题内容

我想要实现以下目标:

+------------------Other container(s)-----------------+
|        +------JScrollPane (vertical)-------+        |
|        | JTextField                        |        |
|        | Box.createRigidArea (vertical)    |        | 
|        | JTextArea                         |        |
|        | { etc.. any other J-component }   |        |
|        |                                   |        |
|        |                                   |        |
|        |                                   |        |
|        |                                   |        |
|        +-----------------------------------+        |
+-----------------------------------------------------+

我能获得的最接近的是以下(伪)代码:

JPanel container = new JPanel(new BorderLayout());
JPanel innerContainer = new JPanel();
innerContainer.setLayout(new BoxLayout(_innerContainer, BoxLayout.Y_AXIS));
JScrollPane scrollPane = new JScrollPane(innerContainer);
container.add(scrollPane, BorderLayout.NORTH);

每当我想添加组件时,就将它们添加到内部容器中:

innerContainer.add(new JTextField());
innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
innerContainer.add(new JTextArea());
innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
innerContainer.add(new JLabel());

....等

我面临以下问题:

我让布局管理器负责所有UI元素的大小。所以最好不要使用任何.setxxSize()方法。一个JTextArea,包含大量文本,将使用所有需要的空间(垂直和水平)。完全没问题。每当调整框架的大小时,JTextArea都会增长,这仍然是可以的。但是每当我缩小框架时,JTextArea都不会相应地进行调整。因此会出现一个水平滚动条,但是我想避免这种情况。我只希望用户垂直滚动。

有人有一些好的秘诀吗?谢谢!

编辑:

SSCCE:

import java.awt.*;

import javax.swing.*;

public class VerticalStackPanel extends JFrame {

    public static void main(String[] args) {
        JFrame frame = new VerticalStackPanel();
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public VerticalStackPanel() {
        super();

        JScrollPane scrollPane = new JScrollPane(createVerticalStackPanel());
        scrollPane.getVerticalScrollBar().setUnitIncrement(16);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        getContentPane().add(scrollPane);
    }

    private Component createVerticalStackPanel() {
        JPanel container = new JPanel(new BorderLayout());
        container.add(createInnerContainer(), BorderLayout.NORTH);

        return container;
    }

    private Component createInnerContainer() {
        JPanel innerContainer = new JPanel();
        innerContainer.setLayout(new BoxLayout(innerContainer, BoxLayout.Y_AXIS));

        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));
        innerContainer.add(createTextArea());
        innerContainer.add(Box.createRigidArea(new Dimension(0, 10)));

        return innerContainer;
    }

    private Component createTextArea() {
        JTextArea textArea = new JTextArea();
        textArea.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vitae diam nunc. Proin vulputate, odio consectetur tincidunt aliquet, metus ipsum rhoncus tellus, in dignissim ligula tortor at risus. Aenean rhoncus lorem a magna luctus molestie. Fusce consequat enim vel quam pharetra varius. Vivamus porta condimentum orci non ultrices. Duis magna arcu, fringilla ut eleifend a, volutpat ac elit. Sed ligula enim, dictum id fringilla vitae, ornare vel nulla. Proin lobortis suscipit lectus eget placerat. Morbi aliquam dolor quis lectus tincidunt eu volutpat risus fermentum. Nunc et sapien a nisl aliquet auctor. Phasellus nec sem tellus, et scelerisque sapien. In a nibh vestibulum velit convallis sodales. Vestibulum tempor fringilla vulputate. Duis hendrerit dolor id urna aliquam cursus auctor enim pulvinar. Nulla rutrum fringilla eros, id congue nisi mattis in. Pellentesque consectetur eleifend mauris, ut aliquam purus convallis ac. Vestibulum pretium, sem at congue faucibus, leo leo volutpat odio, ut feugiat nulla felis a diam. Praesent dignissim eros ac eros semper auctor. Phasellus eu sapien nibh. Quisque pulvinar tristique lectus, quis porttitor purus suscipit sed. Curabitur gravida, ipsum ut vehicula aliquet, erat ipsum tincidunt nulla, eget bibendum felis dolor vel risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus vitae nisl odio, blandit laoreet nibh.");
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        return textArea;
    }

}

每当您水平调整框架的大小时,只要框架变小,文本就会消失。出现水平滚动条,但由于:

scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

文本消失了。JTextArea应该相应地进行调整


问题答案:

好的,所以问题在于JPanel不喜欢嵌入到JScrollPane中。

为了使组件能够使用JScrollPane“很好地播放”,它需要实现Scrollable。如果您只是将JTextArea添加到JScrollPane中,它将完全按照您的要求工作。

无需使用JPanel来保存所有JTextArea,您需要制作一个小的自定义类来扩展JPanel并实现Scrollable。

我已经重写了您的示例并将其粘贴到此处:http :
//pastebin.com/q9x4fv3H,以便您可以查看所有代码。Scrollable
JPanel应该如下所示:

private static class ScrollablePanel extends JPanel implements Scrollable{
    public Dimension getPreferredScrollableViewportSize() {
        return super.getPreferredSize(); //tell the JScrollPane that we want to be our 'preferredSize' - but later, we'll say that vertically, it should scroll.
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 16;//set to 16 because that's what you had in your code.
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return 16;//set to 16 because that's what you had set in your code.
    }

    public boolean getScrollableTracksViewportWidth() {
        return true;//track the width, and re-size as needed.
    }

    public boolean getScrollableTracksViewportHeight() {
        return false; //we don't want to track the height, because we want to scroll vertically.
    }
}

干杯!



 类似资料:
  • 使用Java,我用GridBagLayout创建一个表单。GUI在一个J面板中,它在一个添加到JFrame的scrollPane中。 我希望带有GUI的JPanel的大小是固定的,以防止表单被拉伸,但是,我希望JScrollPanel可以根据用户的喜好调整大小。(类似于MS Paint,画布是我的JPanel)。我想要防止表单被拉伸的原因是因为我希望它能够打印,并且从我现在的方式来看,打印的表单几

  • 我注意到在添加滚动条时会调整高度内容的大小(因为内容超过了宽度)。 密码... 注意:如果我使用,它会在最大化窗口时增加边框之间的间距,我不希望这样。 正如您所看到的,第2行被切断了,是否有必要不调整它的大小(除了将它设置为,如果最大化窗口,它仍然显示条形)?

  • 我想减少GridBagLayout中JTextField和JScrollPane的宽度和高度,但似乎通过设置文本字段列,宽度只能减少到JList中最长内容的长度。我不确定是否需要调整组件的两个或一个尺寸以匹配宽度。 我尝试了setPreferredSize()、setSize()和在文本字段上设置列长度,但它们似乎没有任何作用。

  • 问题内容: 在Java应用程序中使用时,我遇到了一个小问题。 我有一个。这被动态地与按钮(垂直排序),其可以是任何宽度的更新。的自动调整其宽度最大的部件内部。 现在,当出现垂直滚动条时,它会占用my右侧的一些空间,这将导致最大的按钮无法完全显示。除了显示整个按钮之外,我不想使用水平滚动条。 当滚动条出现时,是否有办法调整我的大小,使其很好地显示在我的按钮旁边?还是有其他方法可以使滚动条出现在我的旁

  • 我有一个cardlayout JPanel,里面是一个JScrollPane,里面是一个springlayout JPanel。springlayout JPanel从上到下动态添加JPanel,但是当JButtons超出JPanel时,JScrollPane无法容纳额外的内容。此外,尽管添加了内容,springlayout JPanel的高度仍然保持为0。将Resizeable属性设置为true

  • 我有一个针对不同元素的JPanels集合:JPanelShowPane、seasonsPane、episodesPane、airingsPane 所有这些元素的setLayout设置为null,大小固定为304x416。我将这些JPanel添加到一个大小为1280x416的名为showViewPanel的JPanel中,并设置了一个BoxLayout,如下所示(下面是JFrame中的代码): 我搞