我有一个包含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);
}
}
答案 0 :(得分:3)
如果没有详细说明,解释
JTextArea
应放在JScrollPane
为setPreferredSize
设置初始JTextArea
,例如JTextArea(5, 10)
你被放置了三个JPanels
(这个组件层次结构有什么原因)一个到JScrollPane
,JTextArea
直接放在JPanel
中到JScrollPane
然后使用ComponentListener
是无用且反作用的
答案 1 :(得分:3)
JTextArea
应直接放入JScrollPane
,只要这是您尝试滚动的组件即可。如果您想要滚动其他项目(因此也就是中间JPanel
),那么您可能需要考虑使JPanel
实施Scrollable
以便JScrollPane
知道如何处理它。 JTextArea
实施Scrollable
,这就是为什么它可以与JScrollPane
开箱即用。