【问题标题】:Calling a function on the start of a JavaFX project using SceneBuilder使用 SceneBuilder 在 JavaFX 项目开始时调用函数
【发布时间】:2021-03-09 04:43:09
【问题描述】:

我使用 SceneBuilder 为我的项目创建了一个 GUI,并设置了所有按钮 ID 并为 FXML 文件创建了一个控制器。我希望在启动时和整个程序中在文本区域运行实时时钟。这是我第一次使用 FXML 在 JavaFX 中创建项目,所以我很困惑我应该将这段代码放在哪里。通常代码在没有 FXML 的简单程序中工作,它是这样的代码:

package com.example;
import example; 

public class Layout extends Application {

         TextArea clock;

public void start(Stage stage) throws FileNotFoundException {  
         
         clock = new TextArea();
         clock.setEditable(false);
          BorderPane bp = new BorderPane();
          bp.setTop(clock);
 
          refreshClock();

         Scene scene = new Scene(bp);

        stage.setScene(scene);
        stage.show();
   }
}

  private void refreshClock()
    {
        Thread refreshClock = new Thread()
           {  
              public void run()
              {  
                while (true)
                {
                    Date dte = new Date();
        
                    String topMenuStr = "       " + dte.toString();                       
                    clock.setText(topMenuStr); 
                           
                    try
                    {
                       sleep(3000L);
                    }
                    catch (InterruptedException e) 
                    {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                    }
                  
                }  // end while ( true )
                 
            } // end run thread
         };

         refreshClock.start();
    }

当我尝试在我的 Ui 控制器类中执行当前进度时,尽管我执行了哪些代码并且我不确定下一步该做什么,但文本区域中没有任何内容弹出。这段代码应该在我的主 .java 文件中吗?这是我尝试过的:


package application;

import java.util.Date;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;

public class UiController {
    
    @FXML
    private TextArea clockTextArea;


private void refreshClock()
    {
        Thread refreshClock = new Thread()
           {  
              public void run()
              {  
                while (true)
                {
                    Date dte = new Date();
        
                    String topMenuStr = "       " + dte.toString();                       
                    clockTextArea.setText(topMenuStr); 
                           
                    try
                    {
                       sleep(3000L);
                    }
                    catch (InterruptedException e) 
                    {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                    }
                  
                }  // end while ( true )
                 
            } // end run thread
         };

         refreshClock.start();
    }

    

    
    public void initialize() {
        
        refreshClock();
    
    }
    

【问题讨论】:

  • 完成有关如何使用 fxml 的教程(每个示例都说明了如何/在何处初始化未在 fxml 中配置的内容)。请注意,手动编码已经是错误的:您不得从 fx 应用程序线程更改活动场景图中的节点!了解 fx 中的并发支持
  • 不相关:不要使用旧的 Date 类,替换为较新的 Local/Date/Time api
  • ...请说:minimal reproducible example,包括应用程序、fxml、控制器:)

标签: java eclipse javafx fxml scenebuilder


【解决方案1】:

在 javafx 中,您使用 initialize() 方法中的事件。

例如button.setOnAction(e -> System.Exit(0));clock.onMouseClicked(e -> System.out.println("Test"));

【讨论】:

  • 这是一个选项(使用 fxml 最好的方法是在 fxml 中声明处理程序),但这与问题有什么关系?我没有看到涉及任何事件处理.. ;) 无论如何,请在您的答案中格式化代码以使其可读,无论是在我个人偏好的新行(4 个前导空格)中,还是通过 backtics 内联。使用帮助按钮了解格式化:)
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2014-04-23
  • 2014-12-02
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多