Java 如何使用word wrap使JTextArea使用FormLayout收缩?

Java 如何使用word wrap使JTextArea使用FormLayout收缩?,java,swing,layout-manager,jtextarea,word-wrap,Java,Swing,Layout Manager,Jtextarea,Word Wrap,我需要一个不带滚动条的不可编辑的word可包装文本标签/字段/区域,该标签/字段/区域将与其不带滚动条的父项一起调整大小。它将用于显示各种大小的文本,但“始终”有足够的空间显示全文。在罕见的情况下,用户将窗口调整得太小以至于无法容纳,我希望它截断线条/垂直 我已经搜索了很多,并阅读了我在这里能找到的任何相关问题,但没有找到问题的根源。我选择了JTextArea,因为它具有文字包装功能。我还尝试了JLabel的自定义扩展,但问题仍然是一样的,所以我想我还是坚持使用JTextArea。基于多种原因,

我需要一个不带滚动条的不可编辑的word可包装文本标签/字段/区域,该标签/字段/区域将与其不带滚动条的父项一起调整大小。它将用于显示各种大小的文本,但“始终”有足够的空间显示全文。在罕见的情况下,用户将窗口调整得太小以至于无法容纳,我希望它截断线条/垂直

我已经搜索了很多,并阅读了我在这里能找到的任何相关问题,但没有找到问题的根源。我选择了
JTextArea
,因为它具有文字包装功能。我还尝试了
JLabel
的自定义扩展,但问题仍然是一样的,所以我想我还是坚持使用
JTextArea
。基于多种原因,我确实希望避免使用HTML方法。这已经不是我第一次碰到这个问题了,我以前通过折衷布局(以不同的方式设计表单)解决了这个问题。这肯定不会是我最后一次面对这个问题,所以我想我需要找到一种方法,而不是继续妥协

问题是,虽然这在初始阶段可以正常工作,并且当窗口的大小调整为水平较大时,水平收缩窗口不会更新换行,因此
JTextArea
会水平截断

我的测试表明,这只适用于一些布局管理器,但我不确定问题究竟在“什么级别”。我也在某个地方读到这个问题只存在于Windows上,但我还没有对此进行验证/测试。我正在使用Windows进行开发,所以我所知道的是,问题就在这里,Java 7和Java 8都存在

测试不同的布局管理器显示:

  • FormLayout:收缩时不重新包裹
  • MigLayout:收缩时不重新包裹
  • GridBagLayout:收缩时会重新换行,但不正确,因此某些文本被隐藏
  • 边界布局:按预期工作
  • BoxLayout:如果轴设置为
    Y\u轴
    ,则按预期工作。设置为
    X_轴时
    的行为类似于FormLayout或MigLayout
  • GridLayout:按预期工作
  • CardLayout:按预期工作
现有的应用程序广泛使用FormLayout,如果不进行大量重写,我无法更改它。用一个工作布局(例如,
BorderLayout
)将
JTextArea
包装成一个
JPanel
,只要在层次结构中进一步使用一个“断开的”布局,就没有用。似乎有一些信号丢失了,孩子们看不到,所以我被卡住了,因为我无法真正摆脱
FormLayout
一直到层次结构的顶部

这里存在几个非常相似的问题,但许多是关于
JTextArea
JScrollPane
或其他一些细微变化的组合,没有一个能帮助我找到有效的解决方案。通过尽可能缩小问题的范围并提供一份有效的SCCEE,我希望不会被重复拒绝

SCCEE:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import javax.swing.JTextArea;



public class MainFrame {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    MainFrame window = new MainFrame();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public MainFrame() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final JPanel panel = new JPanel(new FormLayout(
                    new ColumnSpec[] {ColumnSpec.decode("pref:grow"),},
                    new RowSpec[] {RowSpec.decode("pref:grow"),}
                ));
                frame.getContentPane().add(panel, BorderLayout.CENTER);
                final JTextArea textArea = new JTextArea();
                panel.add(textArea, "1, 1, fill, fill");
                textArea.setLineWrap(true);
                textArea.setText("Lorem ipsum dolor sit amet, ut eum assum debet tacimates, mei nisl electram moderatius ei, veri semper cotidieque eu pri. In quot noster vocent usu, ne augue voluptaria quo. Ex per malis vocibus. Consequat mediocritatem no vel.");
    }
}

您可以设置列大小。。。但您也可以将文本区域的
setPreferredSize
设置为
0,0

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

public class Test extends JFrame {
    final JPanel panel;
    final JTextArea textArea;
    final FormLayout fl;
    public Test() {
        this.setBounds(100, 100, 450, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fl = new FormLayout(
                new ColumnSpec[] {ColumnSpec.decode("pref:grow"), 
//                      ColumnSpec.decode("pref:grow")
                        },
                new RowSpec[] {RowSpec.decode("pref:grow"), 
//                      RowSpec.decode("pref:grow")
                        }
            );
        panel = new JPanel(fl);
        this.getContentPane().add(panel, BorderLayout.CENTER);
        textArea = new JTextArea();
        textArea.setPreferredSize(new Dimension());

        panel.add(new JPanel().add(textArea), "1, 1, fill, fill");
//        panel.add(new JPanel().add(new JLabel("test")), "1, 2, fill, fill");
//        panel.add(new JPanel().add(new JLabel("test")), "2, 1, fill, fill");
        textArea.setLineWrap(true);
//        textArea.setWrapStyleWord(true);
        textArea.setText("Lorem ipsum dolor sit amet, ut eum assum "
                + "debet tacimates, mei nisl electram moderatius ei, veri semper cotidieque eu pri. In quot noster vocent usu, "
                + "ne augue voluptaria quo. Ex per malis vocibus. Consequat mediocritatem no vel.");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Test().setVisible(true);
            }
        });
    }
}

我不好意思承认事情就这么简单,但事实确实如此
textArea.setPreferredSize(new Dimension())
使其与
FormLayout
一起工作。我还是不明白为什么,所以如果有人想解释我会很感激的。