簡體   English   中英

設置高度,但不設置JTextArea的寬度

[英]Set height but not width of JTextArea

我在一個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:我可以做到這一點,以使布局的每個元素的高度都可以與其內容成比例,但是具有固定的寬度嗎? 如果可以,怎么辦?

我真正想要的是簡單的-一個文本區域,用於包裹文本,我可以控制寬度,但允許高度隨着添加的更多行而動態縮放。

BoxLayout遵循最大尺寸,因此文本區域會增長以填充面板中所有可用的空間。 您可以使用以下方法覆蓋getMaximumSize()方法以返回首選高度:

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

        return d;
    }
};

有用...

並不是的。 使框架變寬,文本將解開。 然后縮小框架,將出現滾動條。 那是文字不會再換行

您需要執行的操作是強制添加到滾動窗格中的面板與視口具有相同的寬度。 這樣可以使包裝正常工作。

您可以通過在面板上實現Scrollable接口來實現。 具體來說,您需要重寫getScrollableTracksViewportWidth()方法以返回true

或更簡單的解決方案是使用Scrollable Panel類,該類允許您設置面板的屬性以控制此行為。

您可以用ScrollablePanel替換JPanel

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

編輯:

如果有使用其他布局管理器的解決方案

在不覆蓋文本區域的getMaximumSize()方法的情況下,使用Scrollable Panel您應該可以使用以下布局管理器。

GridBagLayout允許您指定“ weightx”約束。 這將使組件填充面板中的所有可用空間。

或者,如果您不喜歡指定GridBagLayout的所有約束,則可以使用“ 相對布局” ,它以首選大小支持組件的垂直/水平布局。

您只需要使用以下命令來強制組件填充水平空間:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM