javaswingjpaneljlabel

JLabel not visible on Jpanel


I'm working on a program in which I'd used a JTextArea, JButton, JLabel and JPanel.
The logic I'd to implement is: user types a text in the given textArea and then click on the button. On button click I'd to retrieve the text from the textArea and create a label with the written text(as in textArea) and show it on the panel.
Everything I'd done previously is correct but the problem is with the label and panel. The label is not visible on the panel.

The code snippets is:

import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;

/**
 *
 * @author mohammadfaisal
 * http://ermohammadfaisal.blogspot.com
 * http://facebook.com/m.faisal6621
 * 
 */
public class CodeMagnets extends JFrame{
    private JTextArea area4Label;
    private JLabel codeLabel;
    private JButton createButton;
    private JPanel magnet;

    public CodeMagnets(String title) throws HeadlessException {
        super(title);
        magnet=new JPanel(null);
        JScrollPane magnetScroller=new JScrollPane(magnet);
              magnetScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        magnetScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(BorderLayout.CENTER, magnetScroller);
        JPanel inputPanel=new JPanel();
        area4Label=new JTextArea(5, 30);
        area4Label.setTabSize(4);
        JScrollPane textScroller=new JScrollPane(area4Label);
        inputPanel.add(textScroller);
        createButton=new JButton("Create code magnet");
        createButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //codeLabel=new JLabel(area4Label.getText());
                codeLabel=new MyLabel(area4Label.getText());//this is for my new question
                codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
                codeLabel.setLocation(50, 20);
                codeLabel.setVisible(true);
                magnet.add(codeLabel);
                area4Label.setText("");
                //pack();
            }
        });
        inputPanel.add(createButton);
        add(BorderLayout.SOUTH, inputPanel);
        //pack();
        setSize(640, 480);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new CodeMagnets("Code Magnets");
    }
}

Solution

  • You need to repaint()/validate() your panle after adding new components in it dynamically. So after this:

    magnet.add(codeLabel);
    

    add this:

    magnet.validate();
    

    or

    magnet.repaint();
    

    Also one thing you are using null layout for magnet panel. So must have to setBounds() of jLable before adding it to magnet panel. So it becomes

    public void actionPerformed(ActionEvent e) {
        codeLabel=new JLabel(area4Label.getText());
        codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        codeLabel.setBounds(50, 20, 100, 100);
        magnet.add(codeLabel);
        magnet.repaint();
        area4Label.setText("");
    }
    

    It is not recommended to use null as layout, you should use proper layout like BorderLayout or GridLayout or even simpler FlowLayout based on your requirement.


    As said by @Andrew use something like:

    codeLabel.setSize(codeLabel.getPreferredSize());
    codeLabel.setLocation(50, 20);
    

    instead of

    codeLabel.setBounds(50, 20, 100, 100);
    

    This will solve the size issue of jLabel.