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(即,在您的情况下为 Frame
) Thread
实例,随后 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){}
}
}
}
所以我读到 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(即,在您的情况下为 Frame
) Thread
实例,随后 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){}
}
}
}