4

我有一个JPanelJButton。 在运行时添加到单击时。JFrame
JLabelJPanelJButton

我使用以下代码:

 panel.setLayout(null);

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

JLabelJPanel.

4

1 回答 1

13

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

 JLabel _lbl=new JLabel();

但是您永远不会将其添加到面板中。相反,您JLabel在面板中添加了一个没有文本的新内容:

 panel.add(new JLabel());

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

在添加类似之后,还可以尝试在您的实例上调用revalidate()和:repaint()JPanelJLabel

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

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

panel.revalidate();
panel.repaint();

有了这个,您可能还需要调用pack()您的框架实例以调整其大小JFrame以适应新组件。

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

而是使用LayoutManager

JPanel或者如果您在简单调用中只有一个组件,add(label);因为它会拉伸到JPanel大小。

更新:

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

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);
    }
}
于 2012-09-30T09:52:27.443 回答