【问题标题】:Set height but not width of JTextArea设置 JTextArea 的高度而不是宽度
【发布时间】:2016-04-23 15:21:58
【问题描述】:

我在 JPanel 中有多个 JTextAreas。我正在使用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:我可以让布局的每个元素都有一个可以缩放到其内容的高度但固定宽度吗?如果有怎么办?

【问题讨论】:

    标签: java swing layout-manager jtextarea boxlayout


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2014-05-26
      • 2017-01-12
      相关资源
      最近更新 更多