在运行时将组件添加到jpanel

isl*_*mer 4 java swing jpanel

我有一个JPanelJButtonJFrame.
在运行时添加JLabelJPanel单击时JButton.

我使用以下代码:

 panel.setLayout(null);

 jLabel _lbl=new jLabel();
 _lbl.setText("Label");
 panel.add(_lbl);
 panel.validate();
Run Code Online (Sandbox Code Playgroud)

但没有任何显示JLabelJPanel.

Dav*_*amp 13

我看到你创建了一个JLabel名为_lbl:

 JLabel _lbl=new JLabel();
Run Code Online (Sandbox Code Playgroud)

但你永远不会把它添加到你的面板.而是JLabel在面板中添加一个没有文本的新内容:

 panel.add(new JLabel());
Run Code Online (Sandbox Code Playgroud)

这将构成一个不可见的空标签.

也可以在添加之后尝试调用revalidate()repaint()在您的JPanel实例上执行以下操作JLabel:

JLabel _lbl=new JLabel("Label");//make label and assign text in 1 line

panel.add(_lbl);//add label we made

panel.revalidate();
panel.repaint();
Run Code Online (Sandbox Code Playgroud)

有了这个,你可能还需要调用pack()你的帧实例,以便调整大小JFrame以适应新的组件.

也请永远不要使用null/ Absolute布局这是非常糟糕的做法(除非做动画)并且可能被证明是有问题的并且非常难以使用.

而是使用LayoutManager:

或者,如果您只是在JPanel简单调用上只有一个组件,add(label);因为它将拉伸到该JPanel大小.

更新:

这是一个小样本.只需JLabelJPanel每次JButton按下时添加s :

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);
    }
}
Run Code Online (Sandbox Code Playgroud)