2013-03-29 23 views
0

我遇到了以下問題,並且我還沒有找到解決方案,但還沒有在網上找到解決方案,或者有類似問題的人的例子。基本上,我有一個主框架包含一個大小相同的面板(作爲主面板),當您按下「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 
      } 
    } 

} 

回答

3

請勿使用KeyListeners。使用Key Bindings

請勿使用線程。使用Swing Timer進行動畫更新將在EDT上完成。

不要爲彈出窗口使用內部框架。使用一個JDialog。

在JPanel而不是JDesktopPane上進行自定義繪製。

請勿使用setIgnoreRepaints()。這用於主動渲染。

請勿使用空的catch子句。

使用標準的Java命名約定。類以大寫字母開頭,變量名不用。

請勿使用setBounds()。使用佈局管理器。

+0

儘管這是一個正確的陳述,但我不確定這是他目前問題的根源。我更擔心他使用Graphics字段g,因爲這提示可能存在更嚴重的錯誤,儘管我沒有完成他所有的代碼。 –

+0

圖形g實際上從來沒有使用過,我只在繪圖函數中使用g。 – Asura

+0

@Asura然後擺脫變量。我還看到第二個JDesktopPane變量,它似乎沒有被使用。每次看代碼我都會看到其他的錯誤。這些糟糕的編程實踐是否會導致問題?我不知道,但現在沒有時間遵循標準編程實踐,所以我們有機會了解您的代碼正在做什麼。 – camickr