2013-07-30 19 views
1

我使用setContentPane(new Gamepanel())从另一个类调用此类。 为什么线程t1没有调用run方法?Jpanel调用线程

public class GamePanel extends JPanel implements Runnable { 

    public static int WIDTH = 1024; 
    public static int HEIGHT = WIDTH/16 * 9; 
    private Thread t1; 
    boolean running; 


    public void addNotify(){ 
     Dimension size = new Dimension(WIDTH,HEIGHT); 
     setPreferredSize(size); 
     running = true; 
     t1.start(); 
    } 


    public void paintComponent (Graphics g){ 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 
     g.setColor(Color.BLACK); 
     g.fillOval(200, 200, 50, 50); 
    } 


    public void run() { 
     while (running){ 
      System.out.println("Runs"); 
    } 
} 

编辑

好吧,其实初始化线程的伎俩。像那

public class GamePanel extends JPanel implements Runnable { 

    public static int WIDTH = 1024; 
    public static int HEIGHT = WIDTH/16 * 9; 
    private Thread t1; 
    boolean running; 


    public void addNotify(){ 
     Dimension size = new Dimension(WIDTH,HEIGHT); 
     setPreferredSize(size); 
     running = true; 
     t1 = new Thread(this); 
     t1.start(); 
    } 



    public void paintComponent (Graphics g){ 
      g.setColor(Color.WHITE); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 
     g.setColor(Color.BLACK); 
     g.fillOval(200, 200, 50, 50); 
    } 


    public void run() { 
     while (running){ 
     System.out.println("Runs"); 
     } 

    } 

} 

我假设这是一个正确的方式开始在启动方法中放置一个游戏循环。 我打算去JFrame + JPanel +线程游戏循环(输入+更新+绘制)。我错了吗?

+0

这应该抛出一个NullPointerException,因为你永远不会初始化't1'...你需要一个't1 = new Thread(this);'wherewhere。请注意,无论您试图达到什么目标,几乎肯定会有更好的方法。 – assylias

+2

螺纹和摆动部件不能混用。阅读http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – Qwerky

回答

0

你的问题不清楚。 Thread1应该做什么? 请给我们详细说明你打电话给T1的方式,以及你如何建立你的班级。 顺便说一句,你把T1放在私人存取处,而且在你的班级中没有看到任何getter/setter。 如果你想操纵它,你必须定义一些方法。

如果你不给一个继承了一个Thread对象的对象,它肯定它不起作用。 请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html 线程类实现自己的Runnable接口。

我的结论与你的代码是不可能告诉你什么是错的,他们有太多的问题领域。

安东尼。

0

您未初始化线程,它必须抛出一个NullPointerException。 试一下 在main方法

t1=new Thread(new GamePanel()); 
t1.start(); 

//没有通知或根据您的REQ修改。 不明确的问题