I want to show many different labels over a map, so I'm using null layout in my panel, and calling setLocation for each label. For some reason, though, the labels don't show. If I remove the pan.setLayout(null), then the label appears in the top-center of the panel. Why isn't null layout working with 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();
}
});
}
}
You have to set the size of the label explicitly; try using
setBounds
instead ofsetLocation
. For example,lab.setBounds(100,100,200,30);
Also there's no need to callsetVisible(true);
on the label.Unless there's a very good reason to use a null layout and you know exactly what you're doing, using a layout manager is always where you should start.
This is the problem with absolute positioning (or
null
layout). It requires you to set the sizes of all your components, otherwise they will stay are their default zero-size and won't appear. That's why it's always better to use a layout manager.