当前位置: 首页 > 知识库问答 >
问题:

未调用JLabel运行函数表单可运行接口

龙默
2023-03-14

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

主要内容:

    public class Label extends JLabel{

    Game game;

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

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

Frmae:

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);
    }
}

共有1个答案

沈鸿光
2023-03-14

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

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();    
    }    
} 

编辑:另外,您的框架类应该如下所示。一个线程执行它的run方法一次,然后它就被认为完成了。如果你想循环,你必须自己做(在下面,使用(true)时,可以将其更改为某个变量,当你想退出程序时,可以将该变量设置为false)。最后,确保在游戏之后调用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){}
        }
    }
} 
 类似资料:
  • 问题内容: 当我尝试在Python 3.3中运行该代码时,该代码不执行任何操作。没有错误或任何东西。怎么了 问题答案: 您仍然必须 调用 该函数。

  • 我有一个叫做srxCOM的dll。用于titan FTP的dll,此dll是为VB6制作的。我想在Visual Studio中使用dll。NET,所以我使用tblimp创建了一个运行时可调用的包装器,并将其命名为srxCOMnet。dll。我在VS项目中添加了dll作为参考,可以访问其中的函数。在创建项目时,我遇到了这个错误, 错误:CLSID{A82C6CF0-7B42-4ABD-AECB-98

  • 我已经使用这个链接在ubuntu服务器上设置了kubenertes。 其他应用程序与NodePort配合得很好,不管是Tomcat/Nginx/Databases。 但在这里,它在创建容器方面失败了。

  • 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出 在这种情况下我该怎么办?

  • 但是,当我检查它们是否运行(查看日志)时,它们不在monitor选项卡()、kudu日志流中,也不在general function视图中: 信息: 使用计时器触发的Azure函数v2调用: 持久函数(但“普通”v2函数不起作用) 使用TFS将代码部署到ARM生成的资源 我有: 删除了Azure门户中的函数 已重命名函数 删除了该函数的blob存储“Azure-Webjobs-hosts”和持久租

  • 我有一个简单的Java项目,它有一个文件输入。Java语言输入代码。java是这样的- 现在,我已经通过导出在Eclipse中创建了一个可执行的jar文件- 现在,当我尝试通过命令提示符打开它时,它工作得非常好。 但是,当我双击runnable jar文件时,我希望打开命令提示符。这里有什么问题? 谢谢