在由面板触发的对话框里怎么实现对面板的重绘?请高手指点下
下面是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class ExitDialog extends JDialog 
{
public ExitDialog(JFrame MainFrame)
{

super(MainFrame,"you dead",true);
JButton again=new JButton("again");
JButton exit=new JButton("exit");
add(again,BorderLayout.WEST);
add(exit,BorderLayout.EAST);
again.addActionListener(new 
ActionListener()
{
public void actionPerformed(ActionEvent event)
{

setVisible(false);
snake1=new SnakePanel();
snake1.repaint();
}
});

exit.addActionListener(new 
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
}
public SnakePanel snake1;
}我试过了,但就是重绘不了,还有说明一点,我面板里面用到了线程,不知道跟这个有没关系。。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【peiqu123】截止到2008-08-02 20:10:48的历史汇总数据(不包括此帖):
    发帖的总数量:2                        发帖的总分数:20                       每贴平均分数:10                       
    回帖的总数量:6                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:2                        结贴的总分数:20                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=peiqu123
      

  2.   

    snake1=new SnakePanel(); 
    snake1.repaint(); 
    ===============
    每响应一次就新建一个Panel?
      

  3.   

    这个,不知道你的Panel在哪里,如果在MainFrame里的话,想重绘的地方调用一下MainFrame.repaint()就OK了
      

  4.   

    Swing的处理一般都在一个叫做EDT的线程中进行处理。你用的线程应该是自己new Thread的,
    一般来说没关系,不过你贴的代码中看不出线程在哪里,所以不好说啊,呵呵。
      

  5.   

    恩,对啊!!线程是做为内部类嵌在JPANEL的子类里的在JPAENL的构造函数里就开始运行线程。
    怎么在弹出的对话框里使线程终止并重新刷新面板,然后在让线程重新运行呢?
      

  6.   

    楼主是不是在做一款类似贪吃蛇的游戏啊?可能是要实现在玩家输了之后弹出对话框提示用户是重玩还是退出吧!我不知道你用来绘制蛇即小矩形的面板(JPanel)或画板(Canvas)与游戏的主窗体之间是什么关系,你可以在主窗体中提供一个用于重新创建一个绘制蛇的面板并重新创建线程的方法(当然在你原有的线程中要有一个用于判断是否继续执行重绘的flag,以便在游戏结束时退出当前线程),将该主窗体对象传给对话框即可在用户点击“again”后调用该方法重新开始游戏
      

  7.   

    是啊呵呵。。
    不过能否说仔细点,我是才开始学GUI。。我用的是JPANEL,
    在主窗口中加入组件JPANEL。。至于在主窗体中提供一个用于重新创建一个绘制蛇的面板并重新创建线程的方法,能否说仔细点...
    顺便问一下,在对话框的按钮“again”…中的监听器应该怎么写?谢谢啊!!!
      

  8.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import javax.swing.*;
    class MainFrame extends JFrame 
    {
    public final static int DEFAULT_WIDTH=500;
    public final static int DEFAULT_HEIGHT=500;
    private ExitDialog dialog;
    public MainFrame()
    {
    setDefaultLookAndFeelDecorated(true);
    setTitle("crazy snake");
    setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    Toolkit kit=Toolkit.getDefaultToolkit();
        Dimension screenSize=kit.getScreenSize();
        int screenWidth=screenSize.width;
        int screenHeight=screenSize.height;
    this.setLocation(screenWidth/6, screenHeight/6);
    //ChoosePanel choose=new ChoosePanel();
    //add(choose);

    //if(choose.getCol()==150)
    //{
    // choose.removeAll();
    //setEnable();

    //
    SnakePanel gamePanel=new SnakePanel();
    add(gamePanel);

    pack();
    }
    }上面是主窗口的,下面是弹出的对话框:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    class ExitDialog extends JDialog 
    {
    public ExitDialog( final JFrame MainFrame)
    {

    super(MainFrame,"you dead",true);
    JButton again=new JButton("again");
    JButton exit=new JButton("exit");
    add(again,BorderLayout.NORTH);
    add(exit,BorderLayout.SOUTH);
    again.addActionListener(new 
    ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {

    //这里要怎么补充的呢?
    }
    });

    exit.addActionListener(new 
    ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    System.exit(0);
    }
    });
    }
    public SnakePanel snake1;
    }
      

  9.   

    你还没有写SnakePanel 的代码吗?我把两个类粘贴了没有SnakePanel没法运行啊!
     public void actionPerformed(ActionEvent event) 

    //这里要怎么补充的呢?
    这里应该新建一个 SnakePanel 的对象并将其添加到主窗体中覆盖原有对象并重新开始线程

    也就是说你应该将SnakePanel 做成一个可以添加到窗体中运行的面板,所有的按钮事件均在该面板类中进行处理,而主窗体只负责加载该面板,弹出的对话框只负责退出游戏和重新开始,建议你整理一下思路后再写写试试
      

  10.   

    在对话框中或面板中怎么新建一个 SnakePanel 的对象并将其添加到主窗体中覆盖原有对象并重新开始线程 ?
      

  11.   

    你的主窗体中应该有一个SnakePanel 的对象的set方法,你在对话框的again的事件响应里新建一个SnakePanel 的对象并通过SnakePanel 的对象的set方法将该对象赋给主窗体后,主窗体对象updateUI(),至于开启线程应该在你的主窗体通过一个按钮或
    菜单等响应事件来实现