【问题标题】:java swing dynamically adding components [duplicate]java swing动态添加组件
【发布时间】:2011-09-24 21:07:26
【问题描述】:

我是 Java Swing 的新手。我对在 Swing 中动态处理组件有一些疑问。

基本上我有一个 Main JPanel 由两个子 JPanel (左面板和右面板)水平对齐。在左边 JPanel 我有一些 JButtons,当我点击 JButton 我需要在右侧显示一些JLabelJTextAreaJPanel。我尝试了一个代码,但它不起作用。当我单击按钮时,它会进入事件侦听器函数但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);
                }
            });
        }
    }

【问题讨论】:

  • 我编辑了你的帖子,如果不是,请回复...

标签: java swing components dynamic


【解决方案1】:

添加标签后添加这一行

rightPanel.updateUI();

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

【讨论】:

  • updateUI 与外观有关,与布局无关。
  • 在 Swing 中,术语layoutlook and feelUI 具有非常具体的含义。用户界面(不是 Swing UI)由这三者组成。这个问题是关于布局的更改(特别是添加一个新组件),但您的答案是指外观,因此是反对票。
  • @Cameron 对不起亲爱的,但我对您的评论不满意,因为答案是正确的,并且说该控件中的 UI,涉及布局。
  • @CameronSkinner 我同意 Pratik 的观点,他提供的答案与问题的主题一致。也许在这种情况下它没有帮助,但其他人可能会使用这个答案。赞成平衡负分。
【解决方案2】:

打电话

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

添加后

【讨论】:

    【解决方案3】:

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

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

    应该可以解决问题。

    【讨论】:

    • 我也尝试过 invalidate、repaint、getParent().invalidate() / repaint() (以及两者一起),但它只是没有成功。我的问题是我从 JPanel 中删除了所有组件,然后重新添加它们,一旦我按照我的意愿最小化/调整窗口大小,它们就会出现。面板上的 revalidate() ,您正在向其中添加组件,也为我做了诀窍。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 2012-09-23
    • 2016-10-25
    • 2011-06-03
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多