考虑以下代码:
Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
System.out.println("An exception occurred!");
});
// set the exception handler for the JavaFX application thread
Thread.currentThread().setUncaughtExceptionHandler((Thread t, Throwable e) -> {
System.out.println("An exception occurred!");
});
Task<?> task = new Task() {
@Override
public Void call() throws Exception {
throw new RuntimeException("foobar");
};
};
new Thread(task).start();
Run Code Online (Sandbox Code Playgroud)
如果我们运行代码,运行时异常永远不会触发默认的异常处理程序,而是由任务使用.我找到的唯一抵消这种方法的方法是在task.setOnFailed中重新抛出异常:
task.setOnFailed((WorkerStateEvent t) -> {
throw new RuntimeException(task.getException());
});
Run Code Online (Sandbox Code Playgroud)
既然JavaFX 8现在支持UncaughtExceptionHandler,为什么不将异常传播到异常处理程序?
ControlsFX类Dialogs标记为已弃用.
用什么代替?
我在javafx2.2中偶然发现了Comboboxes的一个问题.这是场景:
此窗格包含6个组合框.其中三个有固定项:cboReport,cboSales,cboSend.其中三个从db(ObservableList)获取数据,并在窗格变为可见时填充:cboFile,cboCustomer,cboVet
窗口关闭时,窗格上的数据将通过resetGUI_editFilePane()方法重置.有像这样的行:
...
cboReport.getSelectionModel().clearSelection();
cboSales.getSelectionModel().clearSelection();
cboSend.getSelectionModel().clearSelection();
cboFile.getSelectionModel().clearSelection();
cboCustomer.getSelectionModel().clearSelection();
cboVet.getSelectionModel().clearSelection();
cboFile.getItems().clear();
cboCustomer.getItems().clear();
cboVet.getItems.clear();
...
Run Code Online (Sandbox Code Playgroud)
当用户通过按下"editFile"按钮再次打开窗格时,我注意到只有"固定项目"组合框已经清除了它们的选择,动态填充的组合框显示最后选择的项目,尽管选择本身的值是null.这看起来像是一个图形错误或我做错了什么?
有没有解决这个问题的方法或重置组合框的最佳方法是什么?
编辑2014/08/27:
这是正式的错误(clearSelection()不清楚值):https:
//bugs.openjdk.java.net/browse/JDK-8097244
官方的"解决方法"是清除选择后清除ComboBox的值.
cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
Run Code Online (Sandbox Code Playgroud) 我在运行一个简单的hello world应用程序时遇到了一些问题.它抛出以下错误:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182)
at com.sun.javafx.application.LauncherImpl$$Lambda$2/1329552164.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: Error resolving onAction='#printHello', either the event handler is not in the Namespace or there is an error in the script.
/home/willi/java/IdeaProjects/JavaFXApp/out/production/JavaFXApp/sample/sample.fxml:23
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:606)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:766)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2827)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2536)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101)
at sample.Main.start(Main.java:13)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863) …Run Code Online (Sandbox Code Playgroud) 这个小型JavaFX测试应用程序
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class ApplicationWithNonResizableStage extends Application {
public static void main(final String[] args) {
launch(args);
}
@Override
public void start(final Stage primaryStage) throws Exception {
final Rectangle rectangle = new Rectangle(200, 100, Color.POWDERBLUE);
final BorderPane pane = new BorderPane(rectangle);
final Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.setResizable(false);
primaryStage.show();
}
}
Run Code Online (Sandbox Code Playgroud)
产生一个不需要的填充窗口:

删除呼叫primaryStage.setResizable(false)也会删除效果:

出了什么问题?
我想在javafx application中创建一个弹出窗口.给我一些想法.

当我点击复选按钮打开弹出窗口.怎么做?
根据:http: //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#lambda-expressions-in-gui-applications
先前:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
Run Code Online (Sandbox Code Playgroud)
现在,我们可以:
btn.setOnAction(
event -> System.out.println("Hello World!")
);
Run Code Online (Sandbox Code Playgroud)
现在,我在使用Java库时尝试在Scala中执行此操作.
我正在使用JavaFX(Java 1.8 SE中默认包含它).尝试:
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
Error:(204, 46) type mismatch;
found : javafx.scene.input.MouseEvent => Unit
required: javafx.event.EventHandler[_ >: javafx.scene.input.MouseEvent]
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
^
Run Code Online (Sandbox Code Playgroud)
旧样式很好用:
chart.setOnMouseClicked( new EventHandler[MouseEvent] {
override def handle(event: MouseEvent): Unit = println("NOT NOICE")
} )
Run Code Online (Sandbox Code Playgroud)
我在IntelliJ中将项目语言级别设置为Java 8,我使用的是Scala 2.11.1,以及来自Oracle 1.8.0_05的Java
我在这里错过了什么?或者是否根本无法将Scala中的lambda表达式传递给Java,就像在上述示例中所做的那样?
TL; DR:GC正在吃我的活动绑定.
我在Java 7上使用JavaFX 2.2开发并成功部署了一个应用程序.
当我升级/转换到JavaFX 8.0(和Java 8)时,某些功能将"神秘地"停止工作 - 应用程序生命周期中期 - 没有异常或其他错误状态更改的迹象.例如; 按钮停止工作,自定义单元格渲染器停止应用,启用/禁用状态停止更新.
经过几个小时的挖掘,我想我已经将问题跟踪到了我所理解的JavaFX 8中的一些变化以及javafx.beans.WeakListener处理已发现的JavaFX 2.2中的内存泄漏的内部用法.基本上,似乎我正在创建的用于管理数据状态依赖性的绑定正在收集垃圾,尽管Node它们控制的s仍处于活动状态.
当我使用匿名类实例化绑定时,通常会出现问题.可以通过将绑定的引用存储为类成员来修复一些但不是所有问题,从而防止GC收集它.我甚至让整个控制器得到了GC'd,因为它们是通过FXML加载实例化的,并且从不直接引用(我现在总是在父节点的userData属性中填充对控制器的引用).
我的问题是:
令人沮丧的是,我似乎无法在Oracle文档中找到"不要使用匿名类创建绑定"或任何其他确保可靠使用绑定的指南.很多代码示例都使用匿名类绑定.我也无法找到有关如何将JavaFX 2.2应用程序正确更新为JavaFX 8的任何说明.
非常感谢开发非平凡 JavaFX应用程序的人提出的任何建议(我已经开发了3年的JavaFX 2.x应用程序,以及Swing应用程序超过15年,所以这不是一个n00b问题).
注意:我的问题类似于Clean JavaFX属性侦听器和绑定(内存泄漏),但我想明确地知道如何使用复杂绑定并确保它们不会在随机时间进行垃圾收集,而不需要使用带有污染的类对每个实例的引用.