0
我做一個遊戲,並有獲得一個JLabel在一個特定的地方的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
}
}
感謝您的評論,我還有一個問題,我怎麼能添加實例變量級別小組?當我嘗試這樣做時,我得到一個NullPointerException。我可以讓它顯示,如果我實例化一個新的LevelPanel,但我想添加實例變量lp。 – user1965206
沒有看到實際的代碼,我的建議是確保將面板添加到rootpane:JRootPane.setContentPane()。這可能會幫助你更好地理解:http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html – phcoding
此外,您的空指針異常實際上可以與被空,而不是因爲你的變量之一做的面板本身。 – phcoding