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");
    }
}

Answers


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.


Need Your Help

Under which circumstance should I use tries instead of binary trees/hash tables?

algorithm data-structures

Does the fact that the keys are usually strings, make it more useful for collections of string data? I know that a hash table uses less space, because it has a chunk of memory allocated to it, rather

Values aren't being saved in savedInstanceState

android gridview logcat instances

For some reason, the values from the gridView aren't being saved from the Bundle. Nothing is being outputted to the logcat either. Am I getting the values from the gridview properly? It is full of ...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.