我尝试定期在JavaFX应用程序后台线程中运行,这会修改一些GUI属性.
我想我知道如何使用Task和Service类,javafx.concurrent并且无法弄清楚如何在不使用Thread#sleep()方法的情况下运行这样的周期性任务.如果我可以使用一些Executor来自Executors制造方法(Executors.newSingleThreadScheduledExecutor())会很好
我试图Runnable每5秒运行一次,重启javafx.concurrent.Service但它会立即挂起,service.restart甚至service.getState()被调用.
所以最后我使用Executors.newSingleThreadScheduledExecutor(),它Runnable每隔5秒发射一次并使用以下命令Runnable运行另一个Runnable:
Platform.runLater(new Runnable() {
//here i can modify GUI properties
}
Run Code Online (Sandbox Code Playgroud)
它看起来非常讨厌:(有没有更好的方法来使用Task或Service类?
我想随时与FXML控制器类进行通信,以便从主应用程序或其他阶段更新屏幕上的信息.
这可能吗?我还没有找到任何办法.
静态函数可能是一种方式,但它们无法访问表单的控件.
有任何想法吗?
我的应用程序是基于Swing的.我想介绍JavaFX并将其配置为在辅助显示器上呈现场景.我可以使用JFrame来保存一个可以容纳JFXPanel的JFXPanel,但我想用JavaFX API实现这个目的.
子类化com.sun.glass.ui.Application并使用Application.launch(this)不是一个选项,因为调用线程将被阻止.
从Swing EDT实例化一个舞台时,我得到的错误是:
java.lang.IllegalStateException: Toolkit not initialized
Run Code Online (Sandbox Code Playgroud)
有什么指针吗?
编辑:结论
问题:非平凡的Swing GUI应用程序需要运行JavaFX组件.应用程序的启动过程在启动从属服务层后初始化GUI.
解决方案
子类JavaFX Application类并在单独的线程中运行它,例如:
public class JavaFXInitializer extends Application {
@Override
public void start(Stage stage) throws Exception {
// JavaFX should be initialized
someGlobalVar.setInitialized(true);
}
}
Run Code Online (Sandbox Code Playgroud)
旁注:因为Application.launch()方法接受一个Class<? extends Application>参数,所以必须使用全局变量来表示JavaFX环境已被初始化.
替代方法:在Swing Event Dispatcher Thread中实例化JFXPanel:
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel(); // initializes JavaFX environment
latch.countDown();
}
});
latch.await();
Run Code Online (Sandbox Code Playgroud)
通过使用此方法,调用线程将等待,直到设置JavaFX环境.
选择您认为合适的解决方案.我选择了第二个,因为它不需要一个全局变量来表示JavaFX环境的初始化,也不会浪费一个线程.
我想知道是否有可能检测到JavaFX 2中的双击?如何 ?
我想在点击和双击之间进行不同的事件.
谢谢
我有一个TableView具有附加侦听器的应用程序,因此一旦检测到更改就会刷新,但问题是我得到了java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0).这是我的代码:
/**
* This function resets the pagination pagecount
*/
public void resetPage() {
try {
System.out.println("RESET");
int tamRoster = this.loginManager.getRosterService().getRosterList().size();
paginationContactos.setPageCount((int)(Math.ceil(tamRoster*1.0/limit.get())));
int tamEnviados = this.loginManager.getRosterService().getEnviadasList().size();
paginationEnviadas.setPageCount((int)(Math.ceil(tamEnviados*1.0/limit.get())));
int tamRecibidas = this.loginManager.getRosterService().getRecibidasList().size();
paginationRecibidas.setPageCount((int)(Math.ceil(tamRecibidas*1.0/limit.get())));
} catch (Exception e) {
e.printStackTrace();
}
}
public void doSomething () {
this.loginManager.getRosterService().getRosterList().addListener(new ListChangeListener<RosterDTO>() {
@Override
public void onChanged(
javafx.collections.ListChangeListener.Change<? extends RosterDTO> c) {
// TODO Auto-generated method stub
resetPage();
while (c.next()) …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种向JavaFX添加自动完成功能的方法ComboBox.在搜索了很多之后,是时候在这里问了一下.
这AutoFillBox是众所周知的,但不是我正在搜索的内容.我想要的是一个可编辑的组合框,输入列表时应该过滤掉.但是我也希望打开列表而不打字并查看整个项目.
任何的想法?
我有一个只有一个FXML文件的JavaFX应用程序.在这个文件中,我有一个AnchorPane,里面有一个StackPane.这是截图:

当我启动此应用程序时,我想使用AnchorPane自动调整StackPane的大小.从而; StackPane将自动获得当前可用的宽度和高度.在我调整应用程序大小的那一刻,AnchorPane正在自动调整大小,但StackPane保持固定大小.
如何自动调整StackPane的大小并使其在父面板中完全拉伸?
我的守则
Main.java
package app;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
Scene scene = new Scene(root,800,600);
scene.getStylesheets().add(this.getClass().getResource("/app/style1.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
}
Run Code Online (Sandbox Code Playgroud)
MainController.java
package app;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
public class MainController implements Initializable {
@FXML
private AnchorPane anchorPane;
@FXML …Run Code Online (Sandbox Code Playgroud) 我正在研究JavaFX项目.我需要在JavaFX上执行一些任务TextField.
例如,TextField我要打印的"焦点上"事件
System.out.println("Textfield on focus");
Run Code Online (Sandbox Code Playgroud)
它应该打印出"焦点"事件
System.out.println("Textfield out focus");
Run Code Online (Sandbox Code Playgroud) 我有一个带有JavaFX 2的Java桌面应用程序,在我的FX中我有一个TabPane.我想设置默认选项卡.换句话说,我想将选项卡设置为选中.我发现有多种方法可以找出哪个选项卡被选中,setSelectionModel()但我找不到如何使用它.
TabPane tabPane = new TabPane();
Tab tab0 = new Tab("blue");
tab.setContent(new Rectangle(200,200, Color.BLUE));
Tab tab1 = new Tab("green");
tab.setContent(new Rectangle(200,200, Color.GREEN));
tabPane.getTabs().addAll(tab0, tab1);
Run Code Online (Sandbox Code Playgroud) 我有一个显示人员联系方式的JavaFX 2表,让我们想象有三列:名字,姓氏和电子邮件地址.当我的应用程序启动时,它会在表格中填入几行有关系统中已有人员的数据.
问题是列宽都是一样的.大多数情况下,名字和姓氏都会完整显示,但电子邮件地址会被剪裁.用户可以双击标题中的分隔符来调整列的大小,但这将很快变得乏味.
一旦预先填充了表,我想以编程方式调整所有列的大小以显示它们包含的数据,但我无法弄清楚如何实现这一点.我可以看到我可以打电话,col.setPrefWidth(x)但这并没有真正帮助,因为我必须猜测宽度.
javafx-2 ×10
java ×6
fxml ×2
javafx ×2
javafx-8 ×2
autocomplete ×1
click ×1
combobox ×1
css ×1
double-click ×1
pane ×1
selecteditem ×1
smack ×1
tabs ×1