Java 多行JLabel不';不能正确包装

Java 多行JLabel不';不能正确包装,java,swing,user-interface,jlabel,miglayout,Java,Swing,User Interface,Jlabel,Miglayout,我创建了一个SSCCE来演示我的问题。我有一个多行JLabel,它包装得很漂亮,但是当包装到JFrame中时,由于行包装而需要的额外高度没有考虑在内,因此需要滚动或调整窗口大小。以下是创建时的窗口: 我希望使用正确的大小初始化窗口,如下所示: 我尝试过填充、生长、跨度、最小值、首选值、最大值等的每一种组合,但我无法获得我想要的行为。我也尝试过JTextAreas,但它们给我带来的问题比JLabels还要多 这是我的单一文件SSCCE: package SSCCE; import net.m

我创建了一个SSCCE来演示我的问题。我有一个多行JLabel,它包装得很漂亮,但是当包装到JFrame中时,由于行包装而需要的额外高度没有考虑在内,因此需要滚动或调整窗口大小。以下是创建时的窗口:

我希望使用正确的大小初始化窗口,如下所示:

我尝试过填充、生长、跨度、最小值、首选值、最大值等的每一种组合,但我无法获得我想要的行为。我也尝试过JTextAreas,但它们给我带来的问题比JLabels还要多

这是我的单一文件SSCCE:

package SSCCE;

import net.miginfocom.swing.MigLayout;
import java.awt.*;
import javax.swing.*;
import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;

public class App
{
    public static void main( String[] args ) {
        App program = new App();
        SwingUtilities.invokeLater(program::run);
    }

    private void run() {
        JFrame w = new JFrame();
        w.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);



        // "main" shall contain everything to be packed into the JFrame.
        JPanel main = new JPanel();
        main.setLayout(new MigLayout(
                "debug",
                "[][][][][]", // cols
                "[][][fill, grow]" // rows
        ));

        // First row (search UI)
        main.add(new JLabel("Chinese character:"), "spany 2");
        main.add(new JTextField("type here"), "growx, spanx 3");
        main.add(new JButton("Search"), "spany 2, wrap");

        // Second row (checkboxes)
        main.add(new JCheckBox("box1"));
        main.add(new JCheckBox("box2"));
        main.add(new JCheckBox("box3"), "wrap");



        // Third row setup: a 'content' JPanel to be viewed by a JScrollPane, the latter which is to be added to the main JPanel.
        JPanel content = new JPanel();
        content.setLayout(new MigLayout(
                "debug, wrap 4",
                "[left][][][fill, grow]", // cols
                "[top][fill]" // rows
        ));

        // First row of 'content' JPanel: The multi-line JLabel which wraps beautifully but doesn't pack properly.
        JLabel tutorial = new JLabel("<html>" +
                "**WELCOME**<br>This is an English-language interface for the Chinese character etymology search engine     'XiaoXue', " +
                "produced by the Taiwanese academic institution Academia Sinica (中央研究院).<br> NOTE: if the text     between " +
                "those brackets doesn't display, Chinese language support is not configured on your computer." +
                "<br><br>" +
                "**HOW TO USE**<br>Simply enter a single Chinese character into the search field and press 'enter' or     the " +
                "Search button. The checkboxes below the search field are non-operational and merely proof-of-concept     for a future capability to " +
                "combine resources from different databases.<br>NOTE: supports traditional Chinese characters (and those     shared with Japanese), " +
                "but not simplified."
                + "</html>");
        tutorial.setPreferredSize(new Dimension(1,1)); // This encourages the JLabel to wrap.
        content.add(tutorial, "grow, spanx 4");

        // Second row of 'content' JPanel:
        content.add(new JLabel("label1"), "");
        content.add(new JLabel("label2"), "");
        content.add(new JLabel("label3"), "");
        content.add(new JLabel("label4"), "");

        // JScrollPane view of the 'content' JPanel
        JScrollPane contentScrollPane = new JScrollPane(content, VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS);
        contentScrollPane.getVerticalScrollBar().setUnitIncrement(20);
        contentScrollPane.getHorizontalScrollBar().setUnitIncrement(50);

        // Third row finally added to main JPanel.
        main.add(contentScrollPane, "span, width :100%:");



        w.add(main);
        w.pack();
        w.setVisible(true);
    }
}
封装SSCCE;
导入net.miginfocom.swing.MigLayout;
导入java.awt.*;
导入javax.swing.*;
始终导入静态javax.swing.ScrollPaneConstants.HORIZONTAL\u滚动条;
始终导入静态javax.swing.ScrollPaneConstants.VERTICAL\u滚动条;
公共类应用程序
{
公共静态void main(字符串[]args){
应用程序=新应用程序();
调用器(程序::运行);
}
私家车{
JFrame w=新的JFrame();
w、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//“主要”应包含包装在框架内的所有物品。
JPanel main=新的JPanel();
main.setLayout(新布局(
“调试”,
“[]”,//cols
“[[]填充,增长]”//行
));
//第一行(搜索UI)
添加(新的JLabel(“中文字符:”,“spany 2”);
添加(新JTextField(“此处键入”),“growx,spanx 3”);
添加(新的JButton(“搜索”),“spany 2,wrap”);
//第二行(复选框)
添加(新JCheckBox(“box1”);
添加(新JCheckBox(“box2”);
添加(新JCheckBox(“box3”),“wrap”);
//第三行设置:由JScrollPane查看的“内容”JPanel,后者将添加到主JPanel中。
JPanel content=新的JPanel();
content.setLayout(新布局(
“调试,包装4”,
“[左][]填充,生长],//cols
“[顶部][填充]”//行
));
//“内容”JPanel的第一行:多行JLabel,包装精美,但包装不当。
JLabel教程=新的JLabel(“”)+
**欢迎**
这是汉字词源搜索引擎“小雪”的英文界面+ 台湾学术机构中央研究院制作(中央研究院).
注意:如果文本介于“+ 这些括号不显示,您的计算机上未配置中文支持+ “

”+ “**如何使用**
只需在搜索字段中输入一个汉字,然后按“回车”或”+ “搜索按钮。搜索字段下方的复选框是非操作性的,仅是未来功能的概念证明”+ “合并来自不同数据库的资源。
注意:支持繁体中文字符(以及与日语共享的字符)。”+ “但不是简化的。” + ""); tutorial.setPreferredSize(新维度(1,1));//这会鼓励JLabel换行。 添加(教程“成长,spanx 4”); //“内容”JPanel的第二行: 添加(新的JLabel(“label1”),“”); 添加(新的JLabel(“label2”),“”); 添加(新的JLabel(“label3”),“”); 添加(新的JLabel(“label4”),“”); //“内容”JPanel的JScrollPane视图 JScrollPane contentScrollPane=新的JScrollPane(内容、垂直滚动条、水平滚动条); contentScrollPane.getVerticalScrollBar().setUnitIncrement(20); contentScrollPane.getHorizontalScrollBar().setUnitIncrement(50); //第三行最后添加到主JPanel。 添加(contentScrollPane,“跨度,宽度:100%:”); w、 添加(主); w、 包装(); w、 setVisible(真); } }
您不必更改JPanel中的所有内容。您可以从一开始就更改JFrame的大小。尝试放置
w.setSize(200400);
或类似的内容来更改JFrame的大小


另一个解决方案是使用
w.pack()
,但我不确定这是否有效。

您不必更改JPanel中的所有内容。您可以从一开始就更改JFrame的大小。尝试放置
w.setSize(200400);
或类似的东西来更改JFrame的大小


另一个解决方案是使用
w.pack()
,但我不确定这是否可行。

我正在寻找一个动态解决方案。在我的系统上正确打包窗口所需的大小肯定会因平台而异,我不想在任何时候更改文本时重新计算它。当使用“setSize()时'方法,它不会自动调整大小(假定您没有使用'pack()'方法。您也可以使用'setResizeable(false)''方法,这样它就不会调整大小。您可能还想研究从计算机获取屏幕分辨率并使用它。我正在寻找一个动态解决方案。在我的系统上正确打包窗口所需的大小肯定会因平台而异,而且我不想在任何时候更改文本时重新计算它。当您使用“setSize()”方法,它不会自动调整大小(假定您没有使用“pack()”方法)。您也可以使用“setResizeable(false)”方法,这样它就不会调整大小。您可能还需要研究从计算机获取屏幕分辨率并使用它。可能的解决方案此处:可能的解决方案此处: