JLabel 运行 函数形式 运行nable 接口未被调用

JLabel run function form runnable interface is not being called

所以我读到 Runnable 接口的 运行 函数被自动调用,但它对我不起作用(运行 没有被调用)。这是我第一次在 java 做任何事情,所以我可能做了一些愚蠢的事情。下面的代码应该在屏幕上移动一个矩形。矩形已绘制但未移动。

主要:

    public class Label extends JLabel{

    Game game;

    public Label(Game game){
       this.game = game;
    }

    public void paint(Graphics gfx){
        game.render(gfx);
    }
}

朋友:

import javax.swing.*;
import java.awt.*;

public class Frame extends JFrame implements Runnable{

    Game game;

    public Frame(Label label, Game game) {
        this.setSize(600, 600);
        this.setTitle("idk");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setEnabled(true);
        this.game = game;
        this.setContentPane(label);
    }

    public void run(){
        game.update();
        try {
            Thread.sleep(20);
        }
        catch(InterruptedException ex){}
    }
}

标签:

import javax.swing.*;
import java.awt.*;

public class Label extends JLabel{

    Game game;

    public Label(Game game){
       this.game = game;
    }

    public void paint(Graphics gfx){
        game.render(gfx);
    }
}

游戏:

import java.awt.*;

public class Game {

    float x = 0;
    float y = 0;
    float w = 20;
    float h = 20;

    void render(Graphics gfx){
        gfx.fillRect((int)x, (int)y, (int)w, (int)h);
    }

    void update(){
        x += 0.1f;
        System.out.println(x);
    }
}

您需要创建一个 main 方法,在其中创建一个新的 Thread 对象,并在其中传递 Runnable class(即,在您的情况下为 FrameThread 实例,随后 start Thread。见下文:

public class Main
{     
    public static void main(String args[])  
    {    
        Game g = new Game();
        Label l = new Label(g);
        Frame f = new Frame(l, g);    
        Thread t1 =new Thread(f);   
        // this will call run() method in Frame class 
        t1.start();    
    }    
} 

编辑: 此外,您的框架 class 应该如下所示。一个 Thread 执行一次它的 运行 方法,然后就认为它完成了。如果要循环,就得自己做(下面用了一个while(true),可以改成某个变量,想程序退出的时候转成false)。最后,确保在 game.update() 之后调用 repaint() 使绘图生效。

import javax.swing.*;
import java.awt.*;

public class Frame extends JFrame implements Runnable{

    Game game;
    Label label;
    public Frame(Label label, Game game) {
        this.label = label;
        this.setSize(600, 600);
        this.setTitle("idk");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setEnabled(true);
        this.game = game;
        this.setContentPane(label);
    }

    @Override
    public void run(){
        while(true) {
            game.update();
            label.repaint();
            try {
                Thread.sleep(5);
            }
            catch(InterruptedException ex){}
        }
    }
}