Java Swing 动态添加组件

12

我刚接触Java Swing. 在动态添加组件方面有一些疑问。

基本上,我有一个主JPanel,其中包含两个子JPanel(leftpanel和rightpanel),并水平对齐。在左侧JPanel中,我有一些JButtons,当我点击JButton时,我需要在右侧JPanel中显示一些JLabelJTextArea等组件 。我尝试了一些代码,但它不起作用。当我点击按钮时,它会进入事件监听器函数,但是我无法看到JLabel

我在下面给出了我的代码。请查看并纠正我。谢谢提前。

package my;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;

    /**
     *
     * @author root
     */

    public class myAplliwithPanel extends JFrame{

        JPanel rightPanel;

        public myAplliwithPanel() {
             initGui();
        }        

        public void initGui()
        {
           JPanel mainPanel=new JPanel();
           mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));

           JPanel leftPanel=new JPanel();
           leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));

            rightPanel=new JPanel();
           rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));

           JButton dbBut=new JButton("DB");
           JButton appliBut=new JButton("Appli");
           appliBut.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent arg0) {
                    JLabel label=new JLabel("dsggs");
                   rightPanel.add(label);
                }
            });

           JButton backendBut=new JButton("Backend");

           leftPanel.add(dbBut);
           leftPanel.add(appliBut);
           leftPanel.add(backendBut);    

           mainPanel.add(leftPanel);
           mainPanel.add(rightPanel);

           add(mainPanel);

            setTitle("System Manger");
            setSize(400, 400);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);


        }

    public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    myAplliwithPanel myObj = new myAplliwithPanel();
                    myObj.setVisible(true);
                }
            });
        }
    }

1
我编辑了你的帖子,请检查是否有误,如有请恢复原样。 - mKorbel
3个回答

23

在添加(或删除)组件后,需要调用revalidate

rightPanel.add(label);
rightPanel.revalidate();

这应该能解决问题。


我也尝试了invalidate、repaint、getParent().invalidate() / repaint()(以及两者一起),但它们都没有起作用。我的问题是我从JPanel中删除了所有组件,然后重新添加它们,当我最小化/调整窗口大小时,它们确实出现了,就像我想要的那样。在你要添加组件的面板上使用revalidate()也对我有帮助。谢谢! - Igor

12

调用

rightPanel.revalidate();
rightPanel.repaint();

添加之后


4

在添加标签后,请添加此行:

rightPanel.updateUI();

当您在运行时添加任何组件时,需要使用此方法更新UI。


"updateUI" 与外观和感觉有关,而不是布局。 - Cameron Skinner
在Swing中,“布局”、“外观和感觉”以及“UI”这些术语具有非常具体的含义。用户界面(而不是Swing“UI”)由所有三个组成。这个问题涉及到对布局的更改(具体来说是添加一个新组件),但是你的答案涉及到外观和感觉,因此被投了反对票。 - Cameron Skinner
@Cameron,抱歉亲爱的,但我对你的评论不满意,因为答案是正确的,并且涉及到该控件中的UI和布局。 - Pratik
@CameronSkinner 我同意Pratik的观点,他提供的答案符合问题的主题。也许在这种情况下它没有帮助,但其他人仍然可以使用这个答案。我投了赞成票以平衡负分。 - BigFatBaby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接