gpt4 book ai didi

java - JScrollPane 可以调整得更小,但 JTextArea 不能

转载 作者:行者123 更新时间:2023-11-29 07:04:32 24 4
gpt4 key购买 nike

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

更新:这里的想法是 JScrollArea 将包含一个 JPanel(因为它的视口(viewport)只能包含一个组件),并且在该 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);
}
}

最佳答案

JTextArea 应该直接放在 JScrollPane 中,只要它是您要滚动的组件即可。如果还有其他项目你想用它滚动(因此中间 JPanel),那么你可能想考虑让 JPanel 实现 Scrollable 以便 JScrollPane 知道如何处理它。 JTextArea 实现了 Scrollable,这就是它与 JScrollPane 开箱即用的原因。

关于java - JScrollPane 可以调整得更小,但 JTextArea 不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com