add component to jpanel on runtime

前端 未结 1 1870
栀梦
栀梦 2020-12-19 14:54

I have a JPanel and JButton on the JFrame.
on runtime add JLabel to JPanel When click JButton

相关标签:
1条回答
  • 2020-12-19 15:16

    I see you create a JLabel called _lbl:

     JLabel _lbl=new JLabel();
    

    but you never add it to your panel. Instead you add a new JLabel with no text to your panel:

     panel.add(new JLabel());
    

    This would ofcourse construct an empty label which wont be visible.

    Also try calling revalidate() and repaint() on your JPanel instance after adding the JLabel like so:

    JLabel _lbl=new JLabel("Label");//make label and assign text in 1 line
    
    panel.add(_lbl);//add label we made
    
    panel.revalidate();
    panel.repaint();
    

    With this you may also need to call pack() on your frames instance so as to resize the JFrame to fit the new components.

    Also please never use a null/Absolute layout this is very bad practice (unless doing animation) and may prove to be problematic and very hard to use.

    Rather use a LayoutManager:

    • A Visual Guide to Layout Managers

    or if you only have a single component on the JPanel simply call add(label); as it will stretch to the JPanel size.

    UPDATE:

    Here is a small sample. Simply adds JLabels to the JPanel each time JButton is pressed:

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class JavaApplication116 {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new JavaApplication116().createAndShowUI();
                }
            });
        }
    
        private void createAndShowUI() {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            initComponents(frame);
    
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        }
    
        private void initComponents(final JFrame frame) {
            final JPanel panel = new JPanel(new FlowLayout());
            JButton button = new JButton("Add label");
            button.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JLabel _lbl = new JLabel("Label");//make label and assign text in 1 line
    
                    panel.add(_lbl);//add label we made
    
                    panel.revalidate();
                    panel.repaint();
    
                    frame.pack();//so our frame resizes to compensate for new components
                }
            });
            frame.getContentPane().add(panel, BorderLayout.CENTER);
            frame.getContentPane().add(button, BorderLayout.SOUTH);
        }
    }
    
    0 讨论(0)
提交回复
热议问题