如何更新JPanel中的组件?

我有一个JDialog,里面的JPanel的内容是随着按钮的点击而更新的(类似于安装软件时的那个“下一步”按钮),我想实现点击“下一步”时更新JPanle的内容,请问如何做?以下是我的代码,但是不能实现更新JPanel的内容。
[code="java"]
public class MyJDialog extends JDialog{
....
private JPanel panel;
private JButton button = new JButton("next");
...

public MyJDialog (){
    defaultPanel();//默认界面
    ....
    next.addActionListener(new ActionListener() {//点击next按钮后,界面更新
        public void actionPerformed(ActionEvent evt) {
            nextPanel(evt);
        }
    });
}

private void defaultPanel(){
panel = new StepOnePanel() ;
}

private void nextPanel(ActionEvent evt){
panel = new StepTwoPanel();
}
...
}

[/code]

Google了一下,有人说先remove掉panel里面的东西,然后updateUI(),如是我把nextPanel的内容改了一下:
[code="java"]
private void nextPanel(ActionEvent evt){
panel.removeAll()
panel = new StepTwoPanel();
panel.updateUI();
}
[/code]
仍然不能更新界面内容。
StepOnePanel()和StepTwoPanel()都能正确显示,所以大家不要怀疑StepOnePanel()和StepTwoPanel()两个类的正确性。

[b]问题补充:[/b]
pJun (高级程序员):
StepOnePanel() 和 StepTwoPanel()都是一个JPanel对象,默认显示StepOnePanel()或者StepTwoPanel()都能正确显示。
[b]问题补充:[/b]
firefly.li (中级程序员):
首先多谢你的指点,界面显示的是空白,如果不使用removeAll()还是显示的StepOnePanel的界面,不是StepTwoPanel的。

根据lz的代码结构大致修改了一下,看要的是这个效果不?
[code="java"]
package test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJDialog extends JDialog {
private JPanel panel;
private JButton next = new JButton("next");

public MyJDialog() {
    this.setTitle("MyJDialog");
    this.setSize(300, 300);
    this.setLayout(new BorderLayout());
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    this.add(next, BorderLayout.SOUTH);
    defaultPanel();// 默认界面
    this.setVisible(true);
    next.addActionListener(new ActionListener() {
        // 点击next按钮后,界面更新
                public void actionPerformed(ActionEvent evt) {
                    nextPanel(evt);
                }
            });
}

private void defaultPanel() {
    panel = new StepOnePanel();
    this.add(panel, BorderLayout.CENTER);
}

private void nextPanel(ActionEvent evt) {
    this.remove(panel);
    panel = new StepTwoPanel();
    this.add(panel, BorderLayout.CENTER);
    this.validate();
    this.repaint();
}

private class StepOnePanel extends JPanel {
    public StepOnePanel() {
        this.setLayout(new BorderLayout());
        JLabel label = new JLabel("This is StepOnePanel!");
        this.add(label, BorderLayout.CENTER);
    }
}

private class StepTwoPanel extends JPanel {
    public StepTwoPanel() {
        this.setLayout(new BorderLayout());
        JLabel label = new JLabel("This is StepTwoPanel!This is StepTwoPanel!");
        this.add(label, BorderLayout.CENTER);
    }
}

public static void main(String[] args) {
    MyJDialog dialog = new MyJDialog();
}

}

[/code]

StepTwoPanel 有没有放到JPanel上面?? 请LZ检查下.

贴子里有提到加this.setVisible(true),和cardLayout不知道有没用
[url]http://topic.csdn.net/u/20090529/17/22b89315-c8f1-46f5-84a0-89236d36ebe6.html[/url]

可能是没有重绘,lz可以试一下下面的代码。
[code="java"] private void nextPanel(ActionEvent evt){
panel.removeAll()
panel = new StepTwoPanel();
this.validate();
this.repaint();
}[/code]

还有一点,最好是调用MyJDialog.remove(Component comp)方法来移除StepOnePanel,然后再调用MyJDialog.add(Component comp)来添加StepTwoPanel。也就是说,删除及添加操作应该在MyJDialog的级别来做。

还有下面的代码是多余的。
[code="java"]panel.removeAll()[/code]

lz的意思是还是不好使?