Mars酱 2009-07-23 14:30
浏览 599
已采纳

如何更新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的。

  • 写回答

6条回答 默认 最新

  • hunterli0408 2009-07-24 11:34
    关注

    根据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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!