我在主窗口上,添加一个菜单栏和jpanel,删除jpanel,然后再添加一个jpanel。结果主窗口上的菜单栏和关闭窗口点击不起作用了。希望大神给指点一下。

问题描述

packagecom.test;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.*;publicclassMyTankGameextendsJFrameimplementsActionListener{JMenuBarjmb;//一个菜单条,两个菜单,两个菜单项JMenujm2,jm1;JMenuItemjmi1,jmi2;MyStarPanelmsp=null;GamePanelgp;Threadt0;publicMyTankGame(){jmb=newJMenuBar();jm2=newJMenu("帮助");jm1=newJMenu("游戏");jmi1=newJMenuItem("开始");jmi2=newJMenuItem("结束");super.setLayout(null);jm1.add(jmi1);jmi1.addActionListener(this);jmi1.setActionCommand("new");jmi2.addActionListener(this);jmi2.setActionCommand("exit");jm1.add(jmi2);jmb.add(jm1);jmb.add(jm2);this.setJMenuBar(jmb);//创建打开时的界面msp=newMyStarPanel();Threadt0=newThread(msp);t0.start();this.add(msp);this.setLocation(0,0);this.setSize(600,450);this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);this.setVisible(true);}publicstaticvoidmain(String[]args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){newMyTankGame();}});}publicvoidactionPerformed(ActionEventarg0){if(arg0.getActionCommand().equals("new")){//点解开始菜单的new,开始的删去开始时界面,新建一个界面。MyStarPanel.isfront=false;msp.repaint();this.remove(msp);msp=null;t0=null;jmi2.setEnabled(true);jmi1.setEnabled(false);this.validate();this.repaint();GamePanelgp=newGamePanel();Threadt0=newThread(gp);SwingUtilities.invokeLater(t0);System.out.println("111"+Thread.currentThread().getName());this.add(gp);this.validate();this.repaint();}elseif(arg0.getActionCommand().equals("exit")){System.exit(0);}}}classMyStarPanelextendsJPanelimplementsRunnable{inttimes=0;publicstaticbooleanisfront=true;staticintbz=0;publicMyStarPanel(){super();this.setSize(450,350);this.setBackground(Color.blue);System.out.println("color=blue");}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);g.setColor(Color.red);g.fillRect(50,50,300,200);if(times%2==0){g.setColor(Color.yellow);Fontmyfont=newFont("华文行楷",Font.BOLD,30);g.setFont(myfont);if(bz==0){g.drawString("stage:"+1,150,150);}else{g.drawString("英雄败北",150,150);}}else{}}publicvoidrun(){//TODOAuto-generatedmethodstubwhile(isfront){try{Thread.sleep(100);}catch(Exceptione){e.printStackTrace();//TODO:handleexception}times++;this.repaint();}}}classGamePanelextendsJPanelimplementsRunnable{//Herohero=newHero(200,200,0);publicGamePanel(){super();//this.setSize(400,300);this.setBounds(0,0,400,300);this.setBackground(Color.green);System.out.println("color=green");}publicvoidpaint(Graphicsg){drawTank(200,200,g,0,1);}publicvoiddrawTank(intx,inty,Graphicsg,intdirect,inttype){//判断什么类型的坦克switch(type){case0:g.setColor(Color.cyan);break;case1:g.setColor(Color.yellow);break;}//判断方向switch(direct){case0://1.画出上边的矩形g.fill3DRect(x-15,y-10,30,5,false);//2.画出下边的矩形g.fill3DRect(x-15,y+5,30,5,false);//3.画出中间矩形g.fill3DRect(x-10,y-5,20,10,false);//4.画出圆形g.fillOval(x-5,y-5,10,10);//5.画出线g.drawLine(x,y,x-15,y);break;}}@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubwhile(true){try{Thread.sleep(100);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();System.out.println("gm.runiserro.");}this.repaint();}}}我在主窗口上,添加一个菜单栏和jpanel1。在这个界面上,点击菜单:游戏--开始。理论上是删除jpanel1,然后再添加一个jpanel2并在上面画一个图形。结果是要画的图形显示出来了,但主窗口上的菜单和关闭都不能用了,并且我设置的jpanel2为绿色也没有显示出来,显示的是白色。希望大神给指点一下,应该是我的理解有问题!!!

解决方案

解决方案二:
仅供参考:1)将SwingUtilities.invokeLater(t0);改为t0.start();解决按键不能响应问题2)在GamePanel类重写的publicvoidpaint(Graphicsg)方法中首行添加super.paint(g);解决背景颜色问题

时间: 2024-08-31 09:36:47

我在主窗口上,添加一个菜单栏和jpanel,删除jpanel,然后再添加一个jpanel。结果主窗口上的菜单栏和关闭窗口点击不起作用了。希望大神给指点一下。的相关文章

android-Android 自己写的一个全局事件管理器,感觉还有点儿问题,提上代码,希望大神们修改修改!!!

问题描述 Android 自己写的一个全局事件管理器,感觉还有点儿问题,提上代码,希望大神们修改修改!!! import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import android.os

希望大神指点如何截取IP包"

问题描述 一名在校的大学生,希望大神指点如何截取IP包 刚刚学习 网络工程,对于TCP协议也没太明白(准确的说还没讲到,但是自己看过了),我想做个截包软件,截取的包能够打印出来,好让我分析包的数据,但是感觉无从下手.希望大神指点下 解决方案 如果是简单分析数据包,网上有嗅探工具,例如Sniffer之类的... 如果是想编程提升自己的能力,加深理解,那需要下载提供网卡相关方面功能的库. 你首先把网络协议栈相关知识弄懂,很重要. 解决方案二: 获得IP数据有我知道的两种方法: 1.使用socket获

cocos2d x-cocos2d-X关于监听事件的一个小问题(希望大神帮助)

问题描述 cocos2d-X关于监听事件的一个小问题(希望大神帮助) _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, sprite1); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener->clone(), sprite2); 这个我对两个精灵做事件添加,为什么第二个精灵注册的时候为什么是调用这个listener->

c语言-为什么可以这样写 strcmp(a[i],a[i+1]),这不是说明a[i]是*类型的吗?有点晕,希望大神指点。

问题描述 为什么可以这样写 strcmp(a[i],a[i+1]),这不是说明a[i]是*类型的吗?有点晕,希望大神指点. a[1]与&a[1]的区别,a[1]可以表示地址吗?a[1]是不是一个指针呢?为什么可以这样写 strcmp(a[i],a[i+1]),这不是说明a[i]是*类型的吗?有点晕,希望大神指点. 解决方案 我明白了,此处a[]可理解为指针数组 解决方案二: a[1]是数组a的第二个元素,是一个变量,&a[1]是变量a[1]的地址,是一个地址. 解决方案三: Questio

c语言-本人编程初学,刚刚编写了一个整数的比较大小的小程序,希望大神帮我看看

问题描述 本人编程初学,刚刚编写了一个整数的比较大小的小程序,希望大神帮我看看 希望大神帮我看一下是不是可以比较整数的所有情况,而且此算法有点复杂,可以怎样简化 #include int main() { int compare(int a,int b); int x,y,c,g; printf("请输入两个整形数用于比较大小:n"); scanf("%d,%d",&x,&y); c=compare(x,y); if(c==g) printf(&qu

各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧

问题描述 各位能不能提供一个MFC框架的C++计费系统,要是完整的实验报告和可直接运行的代码,希望大神帮帮忙吧 高手有赏追加30金币,说到做到,为了应付学校的生产实习来着,还请各位理解............................................ 解决方案 那你google下吧,只是一个现成的报告,自己找找.我要睡觉了,懒得帮你了. 解决方案二: 一般代写论文是300~500每篇,折合成"金币"大约是6000~10000,而且因为"金币"没

gps-android获取GPS添加权限后出现问题。求大神给指点。

问题描述 android获取GPS添加权限后出现问题.求大神给指点. 解决方案 Allows an application to create mock location providers for testing public static final String ACCESS_MOCK_LOCATION 这没什么错,你不能编译执行么? 解决方案二: debug下的manifest文件中添加了吗 解决方案三: debug下的manifest文件中添加了吗 解决方案四: clean 一下~~

cocos2d x-Cocos2d-X3.0引入头文件的一个小问题(希望大神帮助)

问题描述 Cocos2d-X3.0引入头文件的一个小问题(希望大神帮助) 假如我现在有一个Player.h的头文件 #include "Player.h"和直接class Player导入有什么区别 问什么我的有的时候#include "Player.h"这样导入会报 (error C2011: "Player":"class"类型重定义)错误 希望大神回答 解决方案 说明你的代码有变量冲突,具体看下错误的行.用命名空间区分下

qt-在linux系统下如何获取窗口的指针(多个进程的窗口),希望大神给点指导,谢谢

问题描述 在linux系统下如何获取窗口的指针(多个进程的窗口),希望大神给点指导,谢谢 本人用在linux下用Qt去获取,之前在Widows下通过WINDOWS API函数获取到了多个进程的句柄.现在项目要在linux系统下进行,求大神们指导下,谢谢 解决方案 XLib 最底层的库,只是看了下文档,不知有没有QT高手分享下使用经验