JScrollPane可以调整较小,但JTextArea不会

时间:2014-01-23 19:11:06

标签: java swing jpanel jscrollpane jtextarea

我有一个包含JScrollArea的窗口,其中包含一个包含JTextArea的JPanel。当我调整窗口大小以使其变大时,布局会完美更新,但如果我将窗口缩小,则JPanel不会缩小其内容。我试图在JScrollArea上添加一个ComponentListener来根据视口的新大小调整JPanel的大小,但这似乎打败了垂直滚动条的目的。

更新:这里的想法是JScrollArea将包含一个JPanel(因为它只能为其视口包含一个组件),并且在该JPanel中我将添加多个JPanel,其中包含描述运行给用户的进程的组件。由于可以运行任意数量的这些进程,因此我需要提供某种滚动条功能。因此,我正在使用下面的组件层次结构。

此处所需的行为是窗口可以调整大小,文本区域将相应地包装其内容,如果JPanel的内容垂直大于窗口,则会出现垂直滚动条。有什么建议吗?

public class TestWindow extends JFrame {
    JPanel scrollContentPanel;
    JScrollPane scrollPane;

    public TestWindow() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        this.setContentPane(mainPanel);
        GridBagLayout mainPanelLayout = new GridBagLayout();
        mainPanel.setLayout(mainPanelLayout);

        scrollContentPanel = new JPanel();
        scrollPane = new JScrollPane();
        scrollPane.setViewportView(scrollContentPanel);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        GridBagLayout scrollContentLayout = new GridBagLayout();
        scrollContentPanel.setLayout(scrollContentLayout);

        JPanel contentEntry = new JPanel();
        GridBagConstraints contentEntryConstraints = new GridBagConstraints();
        contentEntryConstraints.weightx = 1.0;
        contentEntryConstraints.insets = new Insets(3, 3, 5, 3);
        contentEntryConstraints.fill = GridBagConstraints.BOTH;
        contentEntryConstraints.gridx = 0;
        contentEntryConstraints.gridy = 1;
        scrollContentPanel.add(contentEntry, contentEntryConstraints);
        GridBagLayout contentEntryLayout = new GridBagLayout();
        contentEntry.setLayout(contentEntryLayout);

        JTextArea descTextArea = new JTextArea();
        descTextArea.setEditable(false);
        descTextArea.setFont(new Font("Dialog", Font.PLAIN, 11));
        descTextArea.setText("This is a description of an arbitrary unspecified length that may easily span multiple lines without any breaks in-between.  Therefore it is necessary that the description automatically wrap as appropriate.");
        descTextArea.setLineWrap(true);
        descTextArea.setWrapStyleWord(true);
        GridBagConstraints descTextAreaConstraints = new GridBagConstraints();
        descTextAreaConstraints.weightx = 1.0;
        descTextAreaConstraints.weighty = 1.0;
        descTextAreaConstraints.insets = new Insets(0, 0, 3, 0);
        descTextAreaConstraints.fill = GridBagConstraints.BOTH;
        descTextAreaConstraints.gridx = 0;
        descTextAreaConstraints.gridy = 1;
        descTextAreaConstraints.gridwidth = 2;
        contentEntry.add(descTextArea, descTextAreaConstraints);
        GridBagConstraints scrollPaneConstraints = new GridBagConstraints();
        scrollPaneConstraints.insets = new Insets(0, 0, 5, 0);
        scrollPaneConstraints.weightx = 1.0;
        scrollPaneConstraints.weighty = 1.0;
        scrollPaneConstraints.fill = GridBagConstraints.BOTH;
        scrollPaneConstraints.gridx = 0;
        scrollPaneConstraints.gridy = 0;
        mainPanel.add(scrollPane, scrollPaneConstraints);

        scrollPane.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent evt) {
                super.componentResized(evt);

                scrollContentPanel.setPreferredSize(scrollPane.getViewportBorderBounds().getSize());
                scrollContentPanel.validate();
            }
        });

        pack();
    }

    public static void main(String[] args) {
        TestWindow wnd = new TestWindow();
        wnd.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:3)

  • 如果没有详细说明,解释

  • ,请不要了解您的目标
  • JTextArea应放在JScrollPane

  • setPreferredSize设置初始JTextArea,例如JTextArea(5, 10)

  • 你被放置了三个JPanels(这个组件层次结构有什么原因)一个到JScrollPaneJTextArea直接放在JPanel中到JScrollPane

  • 然后使用ComponentListener是无用且反作用的

答案 1 :(得分:3)

JTextArea应直接放入JScrollPane,只要这是您尝试滚动的组件即可。如果您想要滚动其他项目(因此也就是中间JPanel),那么您可能需要考虑使JPanel实施Scrollable以便JScrollPane知道如何处理它。 JTextArea实施Scrollable,这就是为什么它可以与JScrollPane开箱即用。