Java 多行JLabel不';不能正确包装
我创建了一个SSCCE来演示我的问题。我有一个多行JLabel,它包装得很漂亮,但是当包装到JFrame中时,由于行包装而需要的额外高度没有考虑在内,因此需要滚动或调整窗口大小。以下是创建时的窗口: 我希望使用正确的大小初始化窗口,如下所示: 我尝试过填充、生长、跨度、最小值、首选值、最大值等的每一种组合,但我无法获得我想要的行为。我也尝试过JTextAreas,但它们给我带来的问题比JLabels还要多 这是我的单一文件SSCCE: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
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)”方法,这样它就不会调整大小。您可能还需要研究从计算机获取屏幕分辨率并使用它。可能的解决方案此处:可能的解决方案此处: