我遇到了以下問題,並且我還沒有找到解決方案,但還沒有在網上找到解決方案,或者有類似問題的人的例子。基本上,我有一個主框架包含一個大小相同的面板(作爲主面板),當您按下「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
}
}
}
儘管這是一個正確的陳述,但我不確定這是他目前問題的根源。我更擔心他使用Graphics字段g,因爲這提示可能存在更嚴重的錯誤,儘管我沒有完成他所有的代碼。 –
圖形g實際上從來沒有使用過,我只在繪圖函數中使用g。 – Asura
@Asura然後擺脫變量。我還看到第二個JDesktopPane變量,它似乎沒有被使用。每次看代碼我都會看到其他的錯誤。這些糟糕的編程實踐是否會導致問題?我不知道,但現在沒有時間遵循標準編程實踐,所以我們有機會了解您的代碼正在做什麼。 – camickr