有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在运行时向jpanel添加组件

我在JFrame上有一个JPanelJButton
在运行时,单击JButtonJLabel添加到JPanel

我使用以下代码:

 panel.setLayout(null);

 jLabel _lbl=new jLabel();
 _lbl.setText("Label");
 panel.add(_lbl);
 panel.validate();

但是在{}中没有显示任何{}


共 (1) 个答案

  1. # 1 楼答案

    我看到您创建了一个名为_lblJLabel

     JLabel _lbl=new JLabel();
    

    但您从未将其添加到面板中。而是向面板添加一个没有文本的新JLabel

     panel.add(new JLabel());
    

    这当然会构造一个不可见的空标签

    在添加JLabel之后,还可以尝试在JPanel实例上调用revalidate()repaint(),如下所示:

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

    这样,您可能还需要在frames实例上调用pack(),以便调整JFrame的大小以适应新组件

    另外,请不要使用null/Absolute布局。这是一种非常糟糕的做法(除非制作动画),可能会出现问题,并且很难使用

    而是使用LayoutManager

    或者,如果JPanel上只有一个组件,只需调用add(label);,因为它将扩展到JPanel大小

    更新:

    这是一个小样本。每次按下JButton时,只需将JLabel添加到JPanel

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