HTML 和 MigLayout 中文本的奇怪行为
Strange behaviour with text inside HTML and MigLayout
我正在努力适应MigLayout
,但我无法弄清楚这个问题。
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
panel.setLayout(new MigLayout());
htmlLabel.setText(""); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
所以对于这个例子,如果我这样做
htmlLabel.setText("Some TEXT")
htmlLabel.setText("Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT");
- 如果我和#2 一样,但在文本周围添加
<html></html>
,即 htmlLabel.setText("<html>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</html>")
- 与#3 相同,但我将
BoxLayout
设置为面板。即 panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
结果
- 我得到this.
- 我得到this.
- 我得到this.
- 我得到this as expected.
#3 有什么问题吗?为什么 MigLayout
像文本增长时那样将文本居中,但只是在 html
标签内时?
注意:我知道 html
标签会使文本换行,但它不应该移动到中心...
解决方案
在尝试了 Charles Knell 的回答后,它奏效了。只是关于如何使用 MigLayout
进行更新。我将标签添加到布局中,如下所示:
add(helpLabel, "grow")
我相信您的 html 标签定义了页面周围的边框,而您的 "long text" 正在到达该边框,由 space.[=10= 创建新行]
写文字也是这样。如果你到达一行的末尾,然后有一个超过每行字符限制的单词,它不会像书本那样使用连字符。它将开始一个新行,继续这个词。
我的理由是什么?文本开始有点偏离页面的左侧,但没有到达同一行的末尾。不是对称的。
我没有使用 MigLayout 的经验,但我相信这可能是导致使用 html 标签与不使用它们之间的文本失真的原因。
您使用的html标签是一种非常非常规的方式。
这或许可以解释为什么您似乎得到了一些意想不到的结果。
你需要的最小标签是
<html><body><p>your content</p></body></html>
见https://www.w3schools.com/html/html_elements.asp
我运行你的代码如下,它运行得很好:
package htmlmiglayout;
import javax.swing.*;
import net.miginfocom.swing.*;
import java.awt.Dimension;
public class HTMLMigLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //new
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
panel.setLayout(new MigLayout());
htmlLabel.setText("<html><body><p>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</p></body></html>"); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
}
但是,如果我使用不同的标签尺寸并设置对齐方式以使文本顶部从标签顶部开始,我可以重现您的输出。
修改后的代码如下:
package htmlmiglayout;
import javax.swing.*;
import net.miginfocom.swing.*;
import java.awt.Dimension;
public class HTMLMigLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //new
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
htmlLabel.setMaximumSize(new Dimension(300,95));
htmlLabel.setMinimumSize(new Dimension(300,95));
htmlLabel.setVerticalAlignment(SwingConstants.TOP);
panel.setLayout(new MigLayout());
htmlLabel.setText("<html><body><p>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</p></body></html>"); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
}
这是输出
因此,您将获得不允许显示字符串末尾的默认 JLabel 尺寸。
这是 MigLayout (https://github.com/mikaelgrev/miglayout/issues/41) 中的一个已知问题。这是 5.0 中的回归,将在下一个版本中修复(截至 2018 年 5 月的当前版本是 5.1)。
如果 HTML JLabel
.
可以增长,dguay 的解决方法效果很好
我正在努力适应MigLayout
,但我无法弄清楚这个问题。
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
panel.setLayout(new MigLayout());
htmlLabel.setText(""); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
所以对于这个例子,如果我这样做
htmlLabel.setText("Some TEXT")
htmlLabel.setText("Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT");
- 如果我和#2 一样,但在文本周围添加
<html></html>
,即htmlLabel.setText("<html>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</html>")
- 与#3 相同,但我将
BoxLayout
设置为面板。即panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
结果
- 我得到this.
- 我得到this.
- 我得到this.
- 我得到this as expected.
#3 有什么问题吗?为什么 MigLayout
像文本增长时那样将文本居中,但只是在 html
标签内时?
注意:我知道 html
标签会使文本换行,但它不应该移动到中心...
解决方案
在尝试了 Charles Knell 的回答后,它奏效了。只是关于如何使用 MigLayout
进行更新。我将标签添加到布局中,如下所示:
add(helpLabel, "grow")
我相信您的 html 标签定义了页面周围的边框,而您的 "long text" 正在到达该边框,由 space.[=10= 创建新行]
写文字也是这样。如果你到达一行的末尾,然后有一个超过每行字符限制的单词,它不会像书本那样使用连字符。它将开始一个新行,继续这个词。
我的理由是什么?文本开始有点偏离页面的左侧,但没有到达同一行的末尾。不是对称的。
我没有使用 MigLayout 的经验,但我相信这可能是导致使用 html 标签与不使用它们之间的文本失真的原因。
您使用的html标签是一种非常非常规的方式。
这或许可以解释为什么您似乎得到了一些意想不到的结果。
你需要的最小标签是
<html><body><p>your content</p></body></html>
见https://www.w3schools.com/html/html_elements.asp
我运行你的代码如下,它运行得很好:
package htmlmiglayout;
import javax.swing.*;
import net.miginfocom.swing.*;
import java.awt.Dimension;
public class HTMLMigLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //new
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
panel.setLayout(new MigLayout());
htmlLabel.setText("<html><body><p>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</p></body></html>"); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
}
但是,如果我使用不同的标签尺寸并设置对齐方式以使文本顶部从标签顶部开始,我可以重现您的输出。
修改后的代码如下:
package htmlmiglayout;
import javax.swing.*;
import net.miginfocom.swing.*;
import java.awt.Dimension;
public class HTMLMigLayout {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //new
JPanel panel = new JPanel();
JLabel htmlLabel = new JLabel();
htmlLabel.setMaximumSize(new Dimension(300,95));
htmlLabel.setMinimumSize(new Dimension(300,95));
htmlLabel.setVerticalAlignment(SwingConstants.TOP);
panel.setLayout(new MigLayout());
htmlLabel.setText("<html><body><p>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</p></body></html>"); // This is where I put my text.
panel.add(htmlLabel);
frame.setPreferredSize(new Dimension(400, 300));
frame.setMinimumSize(frame.getPreferredSize());
frame.setMaximumSize(frame.getPreferredSize());
frame.setLocation(0, 0);
frame.add(panel);
frame.setVisible(true);
}
}
这是输出
因此,您将获得不允许显示字符串末尾的默认 JLabel 尺寸。
这是 MigLayout (https://github.com/mikaelgrev/miglayout/issues/41) 中的一个已知问题。这是 5.0 中的回归,将在下一个版本中修复(截至 2018 年 5 月的当前版本是 5.1)。
如果 HTML JLabel
.