我有以下错误/问题,我还没有在网上找到解决方案或有类似问题的人的例子。基本上我有一个包含相同大小的面板(充当主面板)的主框架和当您按“Enter”时,会弹出一个内部框架(在 playersprite 所在的顶部)充当库存,然后将控制权传递给它,如果再次按“Enter”,则库存被销毁并将控制权传回给主面板。
调用重绘函数,然后重绘角色和地图,这在大约 90% 的时间里工作。当库存被销毁时,其他 10% 或更少的时间似乎调用了重绘(并且工作),除了没有绘制它就好像它在被破坏的面板上绘制一样,因为如果我在主面板(屏幕)上添加一个调用重绘的调试按键,一切都会恢复正常。
当然,我可以在 run() 方法中的每个循环中重新绘制角色,但这太糟糕了,因为我只会在发生变化时重新绘制(即我移动了)
我删除了所有移动和其他代码,因为它们没有用,并且仍然遇到以下代码的问题。您可以将 Character 类视为一个普通绘制的正方形。任何人都知道为什么会发生这种情况?
public class main extends JFrame implements Runnable{
private boolean gameRunning=true;
private Character Link;
private MainScreen theScreen;
public final int ScreenHeight=500;
public final int ScreenWidth=500;
public boolean inMenu=false;
Block ablock=new Block(200,200);
public class Inventory extends JInternalFrame{
public Inventory(){
setBounds(25,25,300,300);
setDefaultCloseOperation(HIDE_ON_CLOSE);
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();
if(key==KeyEvent.VK_ENTER){
try{
setClosed(true);
theScreen.requestFocusInWindow();
theScreen.repaint();
inMenu=false;
}
catch(Exception ex){}
}
}});
}
}
class MainScreen extends JPanel{
MainScreen(){
super();
setIgnoreRepaint(true);
setFocusable(true);
setBounds(0,0,ScreenWidth,ScreenHeight);
setVisible(true);
setBackground(Color.white);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Link.draw(g);
g.drawImage(ablock.getImg(),ablock.getX(), ablock.getY(),null);
}
}
main(){
super();
final JDesktopPane desk = new JDesktopPane();
theScreen=new MainScreen();
add(theScreen);
theScreen.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();
if(key==KeyEvent.VK_ENTER){
inMenu=true;
Inventory myInventory=new Inventory();
desk.add(myInventory);
myInventory.requestFocusInWindow();
}
}
});
add(desk);
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {}
setTitle("Project X");
setResizable(false);
Link=new Character();
setSize(500,500);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
main Game=new main();
new Thread(Game).start();
}
public void run(){
//omitted/irrelevant only contains a FPS count
}
}
}