gpt4 book ai didi

java - 设置 JTextArea 的高度但不设置宽度

转载 作者:行者123 更新时间:2023-12-02 03:41:15 24 4
gpt4 key购买 nike

我在 JPanel 内有多个 JTextArea。我使用 BoxLayout 使它们垂直对齐并填充容器的宽度。

它有效,但它们似乎也扩展以填充整个高度。

我真正想要的很简单 - 一个包含文本的文本区域,我可以在其中控制宽度,但允许高度随着添加更多行而动态缩放。上述方法只是我最好的尝试。如果有一个解决方案使用不同的布局管理器、不同的文本组件等,那么它就有效。

下面是最小的可验证示例:

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(300, 300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel textAreas = new JPanel();
textAreas.setLayout(new BoxLayout(textAreas, BoxLayout.Y_AXIS));

JTextArea area1 = new JTextArea();
area1.append("this is a string");
area1.setLineWrap(true);
area1.setWrapStyleWord(true);
textAreas.add(area1);

JTextArea area2 = new JTextArea("and another that is much longer, so that it wraps to the next line");
area2.setLineWrap(true);
area2.setWrapStyleWord(true);
textAreas.add(area2);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(textAreas);

frame.add(scrollPane);
frame.pack();
frame.setVisible(true);
}

我自己对此主题进行了研究,包括查看不同的布局管理器 ( http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html ),并检查网站上的其他问题,但我运气不佳。

TLDR:我可以让布局的每个元素的高度根据其内容缩放,但宽度固定吗?如果是这样怎么办?

最佳答案

What I really want is simple - a text area that wraps text where I can control the width but allow the height to scale dynamically as more lines are added.

BoxLayout 遵循最大尺寸,因此文本区域会增长以填充面板中的所有可用空间。您可以使用以下方法重写 getMaximumSize() 方法以返回首选高度:

JTextArea area1 = new JTextArea()
{
public Dimension getMaximumSize()
{
Dimension d = super.getMaximumSize();
d.height = getPreferredSize().height;

return d;
}
};

It works...

不是真的。将框架加宽,文本就会展开。然后缩小框架,就会出现滚动条。即文本不会再次换行

您需要做的是强制添加到滚动 Pane 的面板与视口(viewport)的宽度相同。这将使包装能够正常工作。

您可以通过在面板上实现Scrollable 界面来实现此目的。具体来说,您需要重写 getScrollableTracksViewportWidth() 方法以返回 true

或者更简单的解决方案是使用 Scrollable Panel类,它允许您设置面板的属性来控制此行为。

您可以用 ScrollablePanel 替换 JPanel:

//JPanel textAreas = new JPanel();
ScrollablePanel textAreas = new ScrollablePanel();
textAreas.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

编辑:

If there is a solution that uses a different layout manager

在不重写文本区域的 getMaximumSize() 方法的情况下,当使用Scrollable Panel 时,您应该能够使用以下布局管理器。

GridBagLayout 允许您指定“weightx”约束。这将允许组件填充面板中的所有可用空间。

或者,如果您不喜欢指定 GridBagLayout 的所有约束,您可以使用 Relative Layout支持组件按其首选尺寸进行垂直/水平布局。

您只需要使用以下命令来强制组件填充水平空间:

//textAreas.setLayout(new BoxLayout(textAreas, BoxLayout.Y_AXIS));
RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
textAreas.setLayout(rl);

关于java - 设置 JTextArea 的高度但不设置宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36812637/

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