我做的是坦克大战游戏  我的坦克死亡后 没什么提示 
我想在我的坦克死后  弹出game over对话框   点击确定后退出或重新开始,麻烦会的人给点提示吧,如果
我想有两个选择 退出或重新开始,又该如何修改呢?
我有一个boolean的值表示坦克生死   下面节选自我添加对话框那部分的代码  运行后确实能弹出对话框,
但是点击确定后就一直报错了,怎么样能在点击后不报错呢(我猜是程序不知道点击后该做什么的原因吧)?
如何给对话框中的按钮添加监听呢?
public void drawTank(Graphics g){
if(tLive==false){
JOptionPane.showMessageDialog(null, "GAME OVER","GAME OVER",JOptionPane.INFORMATION_MESSAGE);//这句就是我写的弹出对话框的代码 return;
}
switch(Tdir){//这句是坦克没死时判断他运行的方向
case U://向各个方向运行时有不同的图片相对应
g.drawImage(imgs[1], x, y,Tank.TANKWIDTH,Tank.TANKHIGHT ,null);
break;
case D:

解决方案 »

  1.   

    在绘制的方法中,还有所有绘制方法调用的方法中,不要做任何跟绘制无关的事你用JOptionPane没问题,放的位置错了。
      

  2.   

    嗯?那我应该放在那里呢?我得先判断goodtank是否存活然后再显示提示对话框吧?
      

  3.   

    先判断死亡条件 如果满足 就用一个JOptionPane 然后就可以退出。
      

  4.   

    你可以查一下API文档;
    public class JOptionPaneextends JComponentimplements AccessibleJOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框。有关使用 JOptionPane 的信息,请参见 The Java Tutorial 中的 How to Make Dialogs 一节。 虽然由于方法数多使 JOptionPane 类可能显得复杂,但几乎所有此类的使用都是对下列静态 showXxxDialog 方法之一的单行调用: 方法名 描述 
    showConfirmDialog 询问一个确认问题,如 yes/no/cancel。 
    showInputDialog 提示要求某些输入。 
    showMessageDialog 告知用户某事已发生。 
    showOptionDialog 上述三项的大统一 (Grand Unification)。 所有这些方法还可能以 showInternalXXX 风格出现,该风格使用内部窗体来保存对话框(请参见 JInternalFrame)。此外还定义了多种便捷方法,这些方法重载那些基本方法,使用不同的参数列表。 
    所有对话框都是有模式的。在用户交互完成之前,每个 showXxxDialog 方法都一直阻塞调用者。 图标 消息 
    输入值 
    选项按钮 
    这些对话框的基本外形通常与右图类似,尽管各种外观从根本上决定着最后结果。尤其是,外观可以调整布局以适应选项窗格的 ComponentOrientation 属性。
    参数:
    这些方法的参数遵守一致的模式: parentComponent
    定义作为此对话框的父对话框的 Component。通过两种方式使用此参数:包含它的 Frame 可以用作对话框的父 Frame,在对话框的位置使用其屏幕坐标。一般情况下,将对话框紧靠组件置于其之下。此参数可以为 null,在这种情况下,默认的 Frame 用作父级,并且对话框将居中位于屏幕上(取决于 L&F)。 
    message
    要置于对话框中的描述消息。在最常见的应用中,message 就是一个 String 或 String 常量。不过,此参数的类型实际上是 Object。其解释依赖于其类型: 
    Object[]
    对象数组被解释为在纵向堆栈中排列的一系列 message(每个对象一个)。解释是递归式的,即根据其类型解释数组中的每个对象。 
    Component
    该 Component 在对话框中显示。 
    Icon
    该 Icon 被包装在 JLabel 中并在对话框中显示。 
    其他
    该对象通过调用其 toString 方法被转换为 String。结果被包装在 JLabel 中显示。 
    messageType
    定义 message 的样式。外观管理器根据此值对对话框进行不同地布置,并且通常提供默认图标。可能的值为: 
    ERROR_MESSAGE 
    INFORMATION_MESSAGE 
    WARNING_MESSAGE 
    QUESTION_MESSAGE 
    PLAIN_MESSAGE 
    optionType
    定义在对话框的底部显示的选项按钮的集合: 
    DEFAULT_OPTION 
    YES_NO_OPTION 
    YES_NO_CANCEL_OPTION 
    OK_CANCEL_OPTION 
    用户并非仅限于使用此选项按钮集合。使用 options 参数可以提供想使用的任何按钮。 
    options
    将在对话框底部显示的选项按钮集合的更详细描述。options 参数的常规值是 String 数组,但是参数类型是 Object 数组。根据对象的以下类型为每个对象创建一个按钮: 
    Component
    该组件被直接添加到按钮行中。 
    Icon
    创建的 JButton 以此图标作为其标签。 
    其他
    该 Object 通过使用其 toString 方法转换为字符串,并使用该结果作为 JButton 的标签。 
    icon
    要置于对话框中的装饰性图标。图标的默认值由 messageType 参数确定。 
    title
    对话框的标题。 
    initialValue
    默认选择(输入值)。 
    当选择更改时,调用生成 PropertyChangeEvent 的 setValue 方法。 如果已为所有输入 setWantsInput 配置了 JOptionPane,则还可以侦听绑定属性 JOptionPane.INPUT_VALUE_PROPERTY,以确定何时用户输入或选择了值。 当其中一个 showXxxDialog 方法返回整数时,可能的值为: YES_OPTION 
    NO_OPTION 
    CANCEL_OPTION 
    OK_OPTION 
    CLOSED_OPTION 
    示例: 
    显示一个错误对话框,该对话框显示的 message 为 'alert': 
    JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);显示一个内部信息对话框,其 message 为 'information': 
    JOptionPane.showInternalMessageDialog(frame, "information","information", JOptionPane.INFORMATION_MESSAGE);显示一个信息面板,其 options 为 "yes/no",message 为 'choose one': 
    JOptionPane.showConfirmDialog(null, 
    "choose one", "choose one", JOptionPane.YES_NO_OPTION);显示一个内部信息对话框,其 options 为 "yes/no/cancel",message 为 'please choose one',并具有 title 信息: 
    JOptionPane.showInternalConfirmDialog(frame, 
    "please choose one", "information",
    JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);显示一个警告对话框,其 options 为 OK、CANCEL,title 为 'Warning',message 为 'Click OK to continue': 
    Object[] options = { "OK", "CANCEL" };
    JOptionPane.showOptionDialog(null, "Click OK to continue", "Warning", 
    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
    null, options, options[0]);显示一个要求用户键入 String 的对话框: 
    String inputValue = JOptionPane.showInputDialog("Please input a value");显示一个要求用户选择 String 的对话框: 
    Object[] possibleValues = { "First", "Second", "Third" };
    Object selectedValue = JOptionPane.showInputDialog(null, 
    "Choose one", "Input",
    JOptionPane.INFORMATION_MESSAGE, null,
    possibleValues, possibleValues[0]);直接使用:
    要直接创建和使用 JOptionPane,标准模式大致如下: 
         JOptionPane pane = new JOptionPane(arguments);
         pane.set.Xxxx(...); // Configure
         JDialog dialog = pane.createDialog(parentComponent, title);
         dialog.show();
         Object selectedValue = pane.getValue();
         if(selectedValue == null)
           return CLOSED_OPTION;
         //If there is not an array of option buttons:
         if(options == null) {
           if(selectedValue instanceof Integer)
              return ((Integer)selectedValue).intValue();
           return CLOSED_OPTION;
         }
         //If there is an array of option buttons:
         for(int counter = 0, maxCounter = options.length;
            counter < maxCounter; counter++) {
            if(options[counter].equals(selectedValue))
            return counter;
         }
         return CLOSED_OPTION;
     警告:Swing 不是线程安全的。有关更多信息,请参阅 Swing's Threading Policy。 警告:此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder。 
      

  5.   

    咱们真的很像,我前些日子刚写了一个小游戏,叫潜艇作战,也是射击类型的游戏。
    制作过程中也遇到像你一样的问题,就是Game over后选择重新开始和退出的问题。
    首先是退出,这个好说,一个system.exit(0);就解决了。
    另外是页面弹出的问题,就是OVER的时候如何弹出游戏结束的界面。我发现用重写绘图的方法是很麻烦的,所以我用了另一种方式来实现,就是把结束界面方法方法哦一个JPanel里面,然后平常显示该页面为false,OVER的时候显示出来就行了。选择之后在置为false。
    最后是重新开始的问题,这个怪物对象重新New一个,线程重新开启并且。至于本地控制的线程(控制的坦克等)不关闭,只是该线程设置为false不执行,等选择之后了再改回为true。
    网上有马士兵的坦克大战视频,你是不是照着这个做的?
    至于你说的那个绘图方法,我试过,失败了,就换了一种思路了。
      

  6.   

    非常感谢你的回答 但是我水平有限   还想问一些问题,我的jpanel是整个游戏的界面  说说的再加一个jpanel如:jpanel2是重新加一个,在这个jpanel2中弹出对话框,将覆盖原来的jpanel么?我的线程是paintthread 表示的是画坦克,也就是说这些坦克都不画了呗?
      

  7.   

    我的线程是paintthread 表示的是画坦克,也就是说这些坦克都不画了呗? 
    这句话我没理解。给你发个图。
      

  8.   

    正常状态下结束状态时JPanel2肯定会遮盖Jpaenl1的。如果你觉得不好看的话,可以重写Jpaenl2,把Jpanel2置为透明色。只留下两个按钮就行了。或者给加上个背景都是可以的。
      

  9.   

    要退出还不简单。System.exit();就退出整个App了