在为其创建TextLayout之后将JLabel添加到JFrame

时间:2017-09-13 14:01:13

标签: java swing

以下代码不起作用(JLabel不会显示在屏幕上):

    JLabel label = new JLabel("Greetings everyone this is Macklemore");

    Font f = label.getFont();
    String str = label.getText();
    FontRenderContext frc = new FontRenderContext(null, true, true);    

    TextLayout tl = new TextLayout(str, f, frc);

    add(label);

虽然这段代码确实存在(JLabel确实出现在屏幕上):

    JLabel label = new JLabel("Greetings everyone this is Macklemore");

    Font f = label.getFont();
    String str = label.getText();
    FontRenderContext frc = new FontRenderContext(null, true, true);    

    add(label);

    TextLayout tl = new TextLayout(str, f, frc);

为什么TextLayout会干扰'添加(...)'? (这是在一个扩展JFrame的类中进行的方式)。这并不重要,因为无论如何它仍然有效,但我仍然有点好奇,看看是什么导致了这一点。

编辑:其余的代码在它不起作用的情况下看起来像这样(这包括建议的更改):

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        new Window(800, 400, "Project");
    }

}


import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JFrame {

    private static final long serialVersionUID = -8255319694373975038L;

    public Window(int width, int height, String title) {

        setPreferredSize(new Dimension(width, height));
        setMaximumSize(new Dimension(width, height));
        setMinimumSize(new Dimension(width, height));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        setTitle(title);
        setVisible(true);
        setLayout(new FlowLayout());

        JLabel label = new JLabel("Greetings everyone this is Macklemore");

        //suggested change
        Font f = new Font(label.getFont().getAttributes());
        String str = label.getText();
        FontRenderContext frc = new FontRenderContext(null, true, true);    

        TextLayout tl = new TextLayout(str, f, frc);

        add(label);

    }
}

P.S。我真的很讨厌这么长时间发布代码,但现在我确实需要解决这个问题。

1 个答案:

答案 0 :(得分:0)

事实证明这一切只与setVisible(true)命令有关。如果你最后不这样做,这样的问题就会开始发生。虽然所描述的行为仍然很奇怪,但这个问题至少得到了答案。