2013-06-05 55 views
1

所以用我的NetBeans,我开始进入编码游戏......,我已经做到了这一点至今没有错误,但是当我跟我的标题运行它只是一个灰色的盒子“ zachs游戏出现,这就是它....请 - 谢谢灰色屏幕的Netbeans

package swing9; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 

public class JavaApplication2 extends JFrame implements Runnable { 

    int x, y, xDirection, yDirection; 
    Font font = new Font("Arial", Font.BOLD | Font.ITALIC, 30); 

    public void run() { 
     try { 
      while (true) { 

       move(); 

       Thread.sleep(5); 
      } 
     } catch (Exception e) { 

      System.out.println("Error"); 
     } 
    } 

    public void move() { 

     x += xDirection; 
     y += yDirection; 

     if (x <= 0) 
      x = 0; 

     if (x >= 300) 
      x = 300; 

     if (y <= 50) 
      y = 50; 

     if (y <= 300) 
      y = 300; 

    } 

    public void seyXDir(int xdir) { 

     xDirection = xdir; 
    } 

    public void setYDirection(int ydir) { 

     yDirection = ydir; 
    } 

    public class AL extends KeyAdapter { 

     public void keyPressed(KeyEvent e) { 

      int keyCode = e.getKeyCode(); 

      if (keyCode == e.VK_LEFT) { 

       int setXDirection = -1; 

      } 

      if (keyCode == e.VK_RIGHT) { 
       int setXDirection = +1; 

      } 

      if (keyCode == e.VK_UP) { 
       int setYDirection = -1; 
      } 

      if (keyCode == e.VK_DOWN) { 
       int setYDirection = +1; 

      } 

     } 

    } 

    public void keyReleased(KeyEvent e) { 

     int keyCode = e.getKeyCode(); 

     if (keyCode == e.VK_LEFT) { 
      int setXDirection = 0; 
     } 

     if (keyCode == e.VK_RIGHT) { 
      int setXDirecetion = 0; 
     } 

     if (keyCode == e.VK_UP) { 
      int setYDirectiom = 0; 
     } 

     if (keyCode == e.VK_DOWN) { 
      int setYDirecction = 0; 
     } 

    } 

    public JavaApplication2() { 

     addKeyListener((KeyListener) new JavaApplication2.AL()); 

     setTitle("Zachs Game"); 
     setSize(300, 300); 

     setResizable(false); 

     setVisible(true); 
     setBackground(Color.blue); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     x = 150; 
     y = 150; 

    } 

    public void paintComponent(Graphics g) { 

     g.setColor(Color.red); 
     g.drawString("Play", 40, 40); 
     g.setFont(font); 
     g.setColor(Color.red); 
     g.fillOval(x, y, 15, 15); 

     repaint(); 
    } 

    public static void main(String[] args) { 

     new JavaApplication2(); 

     // threads 

     Thread t1 = new Thread(); 
     t1.start(); 
    } 
} 
+0

'keyReleased()'应该是'AL'类的一部分吗?我经常发现'@ Override'标记对于发现这样的小错误非常方便。 –

+0

'Thread.sleep(5)'足够接近'Thread.sleep(0)',因为没有区别。 60fps大致是'Thread.sleep(15)',25fps大致是'Thread.sleep(40)'。大多数人不会看到大多数显示器在30fps的太大的区别... – MadProgrammer

+0

你'KeyListener'不可能永远火的'JFrame'本身不能接收焦点,因为有在它上面的其他组件,可以考虑使用[键绑定(http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)代替 – MadProgrammer

回答

2

JFrame或任何其超类没有实现paintComponent方法,这样就决不会调用帮助,如果你知道问题1。通过检查这个自己添加@Override注释

将此方法移至扩展JComponent并调用的新类作为第一个声明的。

不要在paintComponent内调用repaint,这会造成无限循环并降低性能。 Swing Timers被设计为更容易与摆动部件进行交互。使用这些比原始线程更周期更新。

除此之外:JFrame默认无法对焦,所以需要对焦的KeyEvents不会在未将窗口调焦的情况下触发。改为使用Key Bindings

+0

(不调用任何'paint'方法和里面什么也没有重绘实际上请求重绘时模型已经改变......) – MadProgrammer