HTML和MigLayout中文本的奇怪行为

时间:2017-08-17 13:55:30

标签: java 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);
}

所以这个例子,如果我做

  1. htmlLabel.setText("Some TEXT")
  2. htmlLabel.setText("Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT");
  3. 如果我与#2相同,但在文字周围添加<html></html>htmlLabel.setText("<html>Some LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG LONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG TEXT</html>")
  4. 与#3相同,但我将BoxLayout设置为面板。即panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
  5. 结果

    1. 我得到this.
    2. 我得到this.
    3. 我得到this.
    4. 我得到this as expected.
    5. 那么#3有什么问题?为什么MigLayout会在文本增长时将文本居中,但只是在html标记内?

      注意:我知道html标记会使文字换行,但它不应该移到中心...

      解决方案

      在尝试了Charles Knell的回答之后,它起了作用。只是有关如何使用MigLayout进行更新的更新。我将我的标签添加到布局中:

      add(helpLabel, "grow")

3 个答案:

答案 0 :(得分:2)

您正在使用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);
    }

}

The above code generates the following window:

但是,如果我使用不同的标签尺寸并设置对齐方式,使文本的顶部从标签的顶部开始,我可以重现您的输出。

以下是修改后的代码:

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);
    }

}

这是输出

enter image description here

所以,你得到的默认JLabel维度不允许显示字符串的结尾。

答案 1 :(得分:1)

我相信你的html标签正在定义页面周围的边框,以及你的长文本&#34;正在到达那个边界,在这个空间创造了一条新线。

编写文本时的方式相同。如果你到达一条线的末尾,然后有一个比每行字符数限制更长的单词,它不会做一个连字符,类似于书的方式。它将开始一个新的界限,继续说道。

我背后的理由?文本从页面左侧稍微开始,但没有到达同一行的最后。它不对称。

我没有MigLayout的经验,但我相信这可能是导致文本在使用html标签与不使用它们之间失真的原因。

答案 2 :(得分:1)

这是MigLayout(https://github.com/mikaelgrev/miglayout/issues/41)中的已知问题。它是5.0中的回归,将在下一个版本中修复(截至2018年5月的当前版本为5.1)。

如果可以增加HTML #available

dguay的解决方法效果很好。