How to dynamically add JLabels to JPanel?

martin picture martin · Dec 25, 2012 · Viewed 31.7k times · Source

I'm having a problem with this. I have a JPanel and normally I would create a JLabel like this:

JLabel lblNewLabel = new JLabel("New label");
lblNewLabel.setBounds(0, 0, 135, 14);
panel.add(lblNewLabel);

but I want each time I click a button, in that panel to be created a new JLabel with the same size, but with a different height possition. I tried:

panel.add(new JLabel(stringName));

but this way I don't get to set it's bounds. stringName I get from a JTextField.

Answer

dacwe picture dacwe · Dec 25, 2012

First off, use a layout. Done correctly the layout will place the components like you want. Secondly, when dynamically adding a component to a layout you need to tell the layout to update. Here is an example, it adds a label each time a button is pressed:

public static void main(String[] args) {

    final JFrame frame = new JFrame("Test");
    frame.setLayout(new GridLayout(0, 1));

    frame.add(new JButton(new AbstractAction("Click to add") {
        @Override
        public void actionPerformed(ActionEvent e) {

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    frame.add(new JLabel("Bla"));
                    frame.validate();
                    frame.repaint();
                }
            });
        }
    }));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    SwingUtilities.invokeLater(new Runnable() {
        @Override public void run() {
            frame.setVisible(true);
        }
    });
}