我现在在学习swing。昨天晚上做了一个小的JFrame,遇到如下疑惑。希望各位帮忙指点一下子。先谢谢大家。我有一个JFrame background 2个JPanel p1和p2现在p2上有一个 JButton button。 我想的是如果我点击p2上的button,点一下。然后在另一个panel p2上会出现一个新的按钮 JButton。我的做法如下:p1.add(new JButton("name of button"));
p1.repaint();但不好使。然后我尝试了各种办法如 validate() revalidate() updateUI()等。均没有效果,我想问问大家这到底应该怎么做。有人说可以先把新的button隐藏,但我不认为这是个好办法。感觉思路是把一个新的组建添加到p1里然后重绘p1。这样对吗?到底该怎么做?请大家帮我想想。谢谢各位了。

解决方案 »

  1.   

    我按照你说的,写了段代码。
    jdk1.6,可以实现。
    你实验一下。import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;/**
     * @author bzwm
     *
     */
    public class A extends JFrame{
    public A(){
    final JPanel p1 = new JPanel();
    final JPanel p2 = new JPanel(new FlowLayout());
    JButton b = new JButton("ts...");
    b.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    p2.add(new JButton("....."));
    p2.validate();
    }
    });
    p1.add(b);
    add(p1, BorderLayout.NORTH);
    add(p2, BorderLayout.CENTER);
    setVisible(true);
    setSize(300, 300);
    }

    public static void main(String args[]){
    new A();
    }
    }
      

  2.   

    LS的处理还是可以的,对于Container来说,使用repaint来代替validate/revalidate来重新布局容器中的组件是无法得到预期结果的。像LZ这种要重新布局的,需要调用父组件的validate/revalidate来进行重新布局。至于LZ的显示不出来的问题,我想知道你的 p1 的布局怎么设置的?