JLabel 不会显示在 JFrame 中

JLabel will not Display in JFrame

如果 JLabel 只是一个字符串,该程序将完美运行并打印出 JLabel,但如果我尝试使用 ImageIcon,则不会显示任何内容。

这里是邪恶的class:

public class Window extends JFrame{

    JPanel panel;
    ImageIcon imgIcon;
    JLabel label;

    public Window(String name){
        super(name);

        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);


        //addKeyListener(new KeyboardInput());

        panel = new JPanel();
        panel.setLayout(null);

        imgIcon = new ImageIcon("rorschach.jpg");
        label = new JLabel();
        label.setIcon(imgIcon);

        label.setLocation(0,0);
        label.setSize(label.getPreferredSize());



        panel.add(label);
        add(panel);

        setVisible(true);

    }

    public static void main(String[] args){
        Window window = new Window("test");
    }
}

我也尝试过将其更改为:

label = new JLabel(imgIcon);

但这也没有用

换句话说,"setLocationByPlatform" 行的作用是什么?

是的,它与您上一个问题重复。您看到了 3 个使用空布局并动态更改图像位置的工作示例。

如果删除行:

JButton left = addMotionSupport( component );

从前两个示例中的任何一个,您就得到了您想要的,一个带有面板的框架使用空布局,在位置 (100, 100) 处有一个标签。

在这些示例中,只有包含布局的面板使用了空布局。然后代码在标签上使用了setSize()和setLocation()方法。

在此处的代码中,您为包含标签的面板设置了空布局,但您也将框架设置为使用空布局,这导致了问题。

不仅如此,在您设置大小和位置后,您可以使用 setBounds() 方法覆盖这些值,并且框架的 width/height 将为 (0, 0),因此标签的大小将是 (0, 0) 所以没有什么可画的。

同样,这在 3 个示例中没有完成。遵循示例中的代码。示例中的代码还在 EDT 上创建了 GUI 组件,这就是所有 GUIS 的创建方式。