我遇到了以下错误/问题,但我尚未在网络上找到解决方案或具有类似问题的人的示例。基本上,我有一个主框架,其中包含相同大小的面板(充当主框架)当您按“Enter”键时,会弹出一个内部框架(在玩家 Sprite 所在的位置的顶部)充当库存,然后控制权将传递给它,如果您再次按“Enter”键,库存将被销毁并且控制权将被销毁传回主面板。
调用重绘函数,然后重新绘制角色和 map ,这在大约 90% 的时间内有效。另外 10% 或更少的时间,只要库存被销毁,似乎就会调用重绘(并且有效)除了没有绘制任何东西,就像它在被破坏的面板上绘制一样,因为如果我添加一个在主面板(屏幕)上调用重绘的调试按键,一切都会恢复正常。
当然,我可以在 run() 方法中的每个循环中重新绘制角色,但这很糟糕,因为我只会在发生变化(即我移动)时重新绘制
我删除了所有的移动和其他代码,因为它们没有用,并且仍然遇到以下代码的问题。您可以将角色类视为一个简单绘制的正方形。有人对为什么会发生这种情况有任何见解吗?
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
}
}
}
最佳答案
不要使用 KeyListener。使用Key Bindings .
不要使用线程。使用 Swing 计时器来制作动画,以便更新将在 EDT 上完成。
不要将内部框架用于弹出窗口。使用 JDialog。
在 JPanel 上进行自定义绘画,而不是 JDesktopPane。
不要使用setIgnoreRepaints()。用于主动渲染。
不要使用空的 catch 子句。
使用标准 Java 命名约定。类以大写字符开头,而变量名称则不然。
不要使用setBounds()。使用布局管理器。
关于java - 使用内部框架时,主面板重新喷漆无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696994/