2013-04-02 51 views
0

我做一個遊戲,並有獲得一個JLabel在一個特定的地方enter image description here的JLabel不會,我希望它去

我想JLabel以高於級面板顯示的麻煩。當我嘗試做我認爲可行的事情時,它會顯示一個帶有標籤但沒有級別面板的空白屏幕。另外,當我拖動窗口時爲什麼我的遊戲不能正確重繪?

遊戲

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.Timer; 


public class Game { 

    private Level l; 
    private Player p; 
    private ArrayList<Monster> m; 
    private static JLabel status = new JLabel(); 
    private JLabel score = new JLabel(); 
    private static LevelPanel lp; 
    private Timer timer; 
    public Game() 
    { 
     l = new Level(this,4,11); 
     p = new Player(this,1,1); 
     m = new ArrayList<Monster>(); 
     Monster monster = new SimpleMonster(this,0,0,0,1); 
     Monster m1 = new SimpleMonster(this); 
     m.add(monster); 
     m.add(m1); 
     lp = new LevelPanel(this); 
     status = new JLabel("null"); 
     lp.add(status); 
     timer = new Timer(10, new TimerListener()); 
     timer.start(); 
    } 


    public void win() 
    { 
     timer.stop(); 
     status.setText("Congrats you won!"); 
     System.out.println("You win!"); 
    } 

    public void lose() 
    { 
     timer.stop(); 
     status.setText("Sorry you lose."); 
//  System.out.println("Sorry"); 
    } 

    public static void main(String[] args) 
    { 
     JFrame jframe = new JFrame(); 

     jframe.add(new LevelPanel(new Game())); 
//  jframe.add(lp); 
     jframe.getContentPane().add(lp); 
//  jframe.getContentPane().add(status); 
//  jframe.add(status); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setPreferredSize(new Dimension(500, 500)); 
     jframe.pack(); 
     jframe.setVisible(true); 

    } 

    private class TimerListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
      // TODO Auto-generated method stub 
//   panel.repaint(); 

      //update score and remainder 
      for (Monster m : getMonsters()) 
      { 
       m.update(); 
      } 
      //call update() of all monsters 
     } 
    } 
    public Level getLevel() 
    { 
     return l; 
    } 

    public Player getPlayer() 
    { 
     return p; 
    } 

    public ArrayList<Monster> getMonsters() 
    { 
     return m; 
    } 
} 

我的級別小組

import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 


public class LevelPanel extends JPanel implements KeyListener{ 

    private Game game; 
    public LevelPanel(Game game) 
    { 
     this.game = game; 
     setFocusable(true); 
     addKeyListener(this); 

    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     game.getLevel().draw(g); 
     repaint(); 
    } 
    @Override 
    public void keyPressed(KeyEvent arg0) { 

     if (arg0.getKeyCode() == KeyEvent.VK_UP) 
     { 
      game.getPlayer().move(-1, 0); 
     } 
     if (arg0.getKeyCode() == KeyEvent.VK_DOWN) 
     { 
      game.getPlayer().move(1, 0); 
     } 
     if (arg0.getKeyCode() == KeyEvent.VK_LEFT) 
     { 
      game.getPlayer().move(0, -1); 
     } 
     if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) 
     { 
      game.getPlayer().move(0, 1); 
     } 
//  System.out.print(game.getLevel().getItemsLeft()); 
//  repaint(); 
    } 
    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

回答

1

的問題是,你只是簡單地添加的JPanel和JLabel的使用add(),所以他們只會去的地方默認爲。如果您想將它們放置在某個對齊中,您需要使用佈局管理器。最簡單的一個是BorderLayout,但如果你想完全控制你應該使用GridBagLayout。使用GridBag可以爲每個單獨的Component設置constaints。爲了理解GridBagLayout並在長時間內節省時間,我建議你查看Constraints和Insets以及GridBagLayout。

+0

感謝您的評論,我還有一個問題,我怎麼能添加實例變量級別小組?當我嘗試這樣做時,我得到一個NullPointerException。我可以讓它顯示,如果我實例化一個新的LevelPanel,但我想添加實例變量lp。 – user1965206

+0

沒有看到實際的代碼,我的建議是確保將面板添加到rootpane:JRootPane.setContentPane()。這可能會幫助你更好地理解:http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html – phcoding

+0

此外,您的空指針異常實際上可以與被空,而不是因爲你的變量之一做的面板本身。 – phcoding

相關問題