我在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:我能否做到这一点,以便布局的每个元素的高度都可以与其内容成比例,但是具有固定的宽度?如果可以,怎么办?

最佳答案

我真正想要的是简单的-一个文本区域,用于包裹文本,我可以控制宽度,但允许高度随着添加的更多行而动态缩放。


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);

10-02 05:51
查看更多