我在JTextArea
内有多个JPanel
。我使用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:我可以这样做,所以布局的每个元素都有一个高度可以扩展到其内容但是固定宽度?如果是这样的话?
答案 0 :(得分:2)
我真正想要的是简单的 - 一个包装文本的文本区域,我可以控制宽度,但允许高度随着更多行的增加而动态缩放。
BoxLayout尊重最大尺寸,因此文本区域会增长以填充面板中的所有可用空间。您可以使用以下内容覆盖getMaximumSize()
方法以返回首选高度:
JTextArea area1 = new JTextArea()
{
public Dimension getMaximumSize()
{
Dimension d = super.getMaximumSize();
d.height = getPreferredSize().height;
return d;
}
};
它有效......
不是真的。使框架更宽,文本将展开。然后收缩框架,将出现滚动条。那就是文字不会再包装
您需要做的是强制添加到滚动窗格的面板与视口的宽度相同。这将使包装正常工作。
您可以通过在面板上实现Scrollable
界面来实现此目的。具体而言,您需要覆盖getScrollableTracksViewportWidth()
方法以返回true
。
或者更简单的解决方案是使用Scrollable Panel类,它允许您设置面板的属性以控制此行为。
您可以将JPanel
替换为ScrollablePanel
:
//JPanel textAreas = new JPanel();
ScrollablePanel textAreas = new ScrollablePanel();
textAreas.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
编辑:
如果有使用不同布局管理器的解决方案
如果不覆盖文本区域的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);