JLabel不会显示JPanel.setLayout(null)。 为什么?

我想在地图上显示许多不同的标签,所以我在我的面板中使用null布局,并为每个标签调用setLocation。 但是,出于某种原因,标签没有显示。 如果我删除了pan.setLayout(null),则标签会出现在面板的顶部中心。 为什么null布局不能与setPosition一起使用?

package mapa; import java.awt.*; import javax.swing.*; public class Mapa extends JFrame { private static JPanel pan; private static JLabel lab; public Mapa() { } private static void createAndShowGUI() { Mapa frame = new Mapa(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); lab = new JLabel("TEXTO"); lab.setBackground(Color.black); lab.setForeground(Color.white); lab.setOpaque(true); lab.setVisible(true); pan = new JPanel(); pan.setLayout(null); pan.setPreferredSize(new Dimension(640,480)); pan.add(lab); lab.setLocation(100, 100); frame.getContentPane().add(pan, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } } 

这是绝对定位(或null布局)的问题。 它要求您设置所有组件的大小,否则它们将保留默认的零大小并且不会出现。 这就是使用布局管理器总是更好的原因。

您必须明确设置标签的大小; 尝试使用setBounds而不是setLocation 。 例如, lab.setBounds(100,100,200,30); 也没有必要调用setVisible(true); 在标签上。

除非有充分的理由使用空布局并且您确切知道自己在做什么,否则使用布局管理器总是应该从哪里开始。