首页 > 编程语言 >JavaFX 学习记录

JavaFX 学习记录

时间:2023-02-28 09:36:14浏览次数:51  
标签:main 记录 args JavaFX public 学习 Application FXTestMain class

使用 JavaFX 时一些奇怪的问题

继承自 Application 类的构造函数会被执行两次

先看代码:

// FXTestMain.java
import javafx.application.Application;
import javafx.stage.Stage;

public class FXTestMain extends Application {
    public void main(String[] args) { launch(args); }
    int counter = 0;
    public FXTestMain() {
        System.out.println(++counter);
    }
    @Override
    public void start(Stage stage) {}
}


//FXtest.java
public class FXTest {
    public static void main(String[] args) {
        FXTestMain GUI = new FXTestMain();
        GUI.main(args);
    }
}

将会输出:

1
1

在 Line.9 打个断点,会发现这一句会被线程 mainJavaFX Application Thread 都执行一遍,然而把 GUI.main(args) 注释掉后就很正常。于是考虑看 launch 到底干了什么:(经过反编译后的代码)

// Application.class: Line.52
LauncherImpl.launchApplication(var12, var0);

// LauncherImpl.class: Line.82
launchApplication(var0, var2, var1);

// LauncherImpl.class: Line.98
launchApplication1(var0, var1, var2);

// LauncherImpl.class: Line.514-522
try {
    Constructor var3 = var1.getConstructor();
    var10.set((Preloader)var3.newInstance());
    ParametersImpl.registerParameters((Application)var10.get(), new ParametersImpl(var2));
} catch (Throwable var4) {
    System.err.println("Exception in Preloader constructor");
    pConstructorError = var4;
    error = true;
}

可见 launch 方法中通过 ConstructornewInstance() 创建和初始化一个新实例,会调用它的构造方法。

使用 SourceDataLine 播放音频错误重复循环一片段

The sound of putting chess pieces suddenly gets out of control. · Issue #2 · Choimoe/GoChess (github.com)

个人猜测是因为多次播放,对 buffer 的抢占导致的。在 Doc4dev 文档 里可以看到具有非实时声音数据且可以预加载到内存时,应该使用使用Clip,尤其是它已经被加载进内存的情况下。

解决办法:使用 Clip 进行播放。但是也会导致相邻两子间隔太短而吞音,不整了。

Main 方法结束后,程序仍未退出

我创建了 IOThread 类,在读取存档时候会被调用,而常态在 wait 状态:

    public void reStartRead() {
        try {
            synchronized (this) {
                this.notify();
                additionAction();
                this.wait();
            }
        } catch (InterruptedException e) {
            System.out.println("[ERROR] Cannot restart thread to start read saves.");
            e.printStackTrace();
        }
    }

只要在退出时使用 this.interrupt(); 就好了(不要使用已经废弃的 stop())。

标签:main,记录,args,JavaFX,public,学习,Application,FXTestMain,class
From: https://www.cnblogs.com/choimoe/p/javafx.html

相关文章

  • React学习笔记(二)—— JSX、组件与生命周期
    一、JSX1.1、什么是JSX?JSX=JavaScriptXML,这是React官方发明的一种JS语法(糖)概念:JSX是JavaScriptXML(HTML)的缩写,表示在JS代码中书写HTML结构设想如下变量声明:......
  • 2023: day1前端晚上学习笔记
     2023.02.27一.webpack默认webpack打包的时候只会处理JS之间的依赖关系!!!css-loader(css-loader会处理import/require()@import/url引入的内容。)style-loader(将模......
  • javaSE学习二
    使用Scanner实现用户交互   注意点:使用next方法时一定读取到有效字符后才能结束输入,有效字符前的空白自动去除,有效字符后的空白为结束符,next不能得到有空格的字符串......
  • 听说大家很感兴趣玮子的学习心得,采访来了
    哪有那么多人生开挂,不过都是厚积薄发——哲理熊上次玮子投稿以后,大家都很好奇,为什么他可以坚持在朋友圈打卡几百天,想技术问题那么有深度,今天就随熊哥走进科学,揭秘玮......
  • 听说大家很感兴趣玮子的学习心得,采访来了
    哪有那么多人生开挂,不过都是厚积薄发——哲理熊上次玮子投稿以后,大家都很好奇,为什么他可以坚持在朋友圈打卡几百天,想技术问题那么有深度,今天就随熊哥走进科学,揭秘玮......
  • Go语言入门学习
    一.Go语言介绍Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由RobertGriesemer,RobPike,KenThompson主持开发,后来还加入了Ian......
  • seata RM中没有undo_log记录
    nacos注册成功,seata服务器日志显示回滚成功,但是实际上没有回滚,需要查询原因,AT模式回滚需要数据库中有undo_log日志,实际上没有看到这个表的记录,说明全局事物开启后,服务数......
  • 记录写了6年代码的心得
    心得:写代码的人有多舒服,运行代码的电脑就有多难受!强类型语言与弱类型语言的区别就能很好的体现现在的js的更新我个人没法理解,完全是奔着更多人去的如果未来的某天g......
  • SSM框架-MyBatis学习日记3
    配置解析mybatis-config.xml系统核心配置文件MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。能配置的内容如下:configuration(配置)properties(属性......
  • hystrix学习(一)之Command Properties之Execution
        一、HystrixCommand.run执行时会用到isolation.strategy:有两个选项二选一:1、线程:在单独的线程上执行,并发请求受线程池中线程数的限制2、信号量:在......