我有一个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的意思是还是不好使?