如何动态添加JLabel到JPanel?

vej*_*tin 9 java swing jlabel dynamic setbounds

我遇到了这个问题.我有一个JPanel,通常我会像这样创建一个JLabel:

JLabel lblNewLabel = new JLabel("New label");
lblNewLabel.setBounds(0, 0, 135, 14);
panel.add(lblNewLabel);
Run Code Online (Sandbox Code Playgroud)

但我希望每次单击一个按钮,在该面板中创建一个具有相同大小但具有不同高度的新JLabel.我试过了:

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

但这样我就无法设定它的界限.我从JTextField获取stringName.

dac*_*cwe 11

首先,使用布局.正确完成布局将放置您想要的组件.其次,在动态添加组件到布局时,您需要告诉布局更新.这是一个例子,每次按下按钮时都会添加一个标签:

public static void main(String[] args) {

    final JFrame frame = new JFrame("Test");
    frame.setLayout(new GridLayout(0, 1));

    frame.add(new JButton(new AbstractAction("Click to add") {
        @Override
        public void actionPerformed(ActionEvent e) {

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    frame.add(new JLabel("Bla"));
                    frame.validate();
                    frame.repaint();
                }
            });
        }
    }));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    SwingUtilities.invokeLater(new Runnable() {
        @Override public void run() {
            frame.setVisible(true);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • Swing组件也应该在EDT上创建,`setSize`是一个真正的不使用正确的`LayoutManager`并在`JFrame`上调用`pack()`然后将其设置为可见 (3认同)