标签: javafx-8

在JavaFx Label中显示更改的值

在JavaFX中,如何使用"标签"显示随时间不断变化的值?

java javafx-2 javafx-8

21
推荐指数
4
解决办法
5万
查看次数

JavaFX的任务似乎消耗了异常.这是一个错误还是一个功能?

考虑以下代码:

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,为什么不将异常传播到异常处理程序?

java javafx-8

21
推荐指数
3
解决办法
8067
查看次数

21
推荐指数
2
解决办法
1万
查看次数

Combobox清算价值问题

我在javafx2.2中偶然发现了Comboboxes的一个问题.这是场景:

  • 用户单击"editFile"按钮.
  • 另一个窗格变为可见(使用setVisible方法).

此窗格包含6个组合框.其中三个有固定项:cboReport,cboSales,cboSend.其中三个从db(ObservableList)获取数据,并在窗格变为可见时填充:cboFile,cboCustomer,cboVet

  • 用户从cboFile中选择文件编号.其余的组合框设置正确的值.
  • 用户按下保存按钮,文件将按预期保存.
  • 接下来,用户按下关闭按钮.

窗口关闭时,窗格上的数据将通过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)

combobox selectionmodel javafx-2 javafx-8

20
推荐指数
3
解决办法
4万
查看次数

加载FXML时解析"onAction"时出错

我在运行一个简单的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)

java javafx javafx-8

20
推荐指数
1
解决办法
2万
查看次数

JavaFX:为什么stage.setResizable(false)会导致额外的边距?

这个小型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)也会删除效果:

无保证金的阶段

出了什么问题?

java javafx windows-7-x64 javafx-8

19
推荐指数
1
解决办法
2万
查看次数

如何在javafx中创建弹出窗口

我想在javafx application中创建一个弹出窗口.给我一些想法.
在此输入图像描述

当我点击复选按钮打开弹出窗口.怎么做?

java javafx javafx-2 scenebuilder javafx-8

19
推荐指数
2
解决办法
11万
查看次数

19
推荐指数
1
解决办法
7271
查看次数

Scala使用Java库,利用Java 8中的lambda表达式支持

根据: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,就像在上述示例中所做的那样?

lambda scala javafx java-8 javafx-8

19
推荐指数
2
解决办法
6088
查看次数

在JavaFX 8中保持中间绑定不被垃圾收集的建议方法是什么?

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属性中填充对控制器的引用).

我的问题是:

  1. 相关的错误是非确定性的(或者至少是内存占用的函数,
  2. 如果应该避免通过匿名类进行绑定,那么在大型现有代码库中查找每个实例来进行更改是很多工作
  3. 即使我能找到每个实例,它也会极大地混乱代码

令人沮丧的是,我似乎无法在Oracle文档中找到"不要使用匿名类创建绑定"或任何其他确保可靠使用绑定的指南.很多代码示例都使用匿名类绑定.我也无法找到有关如何将JavaFX 2.2应用程序正确更新为JavaFX 8的任何说明.

非常感谢开发非平凡 JavaFX应用程序的人提出的任何建议(我已经开发了3年的JavaFX 2.x应用程序,以及Swing应用程序超过15年,所以这不是一个n00b问题).


注意:我的问题类似于Clean JavaFX属性侦听器和绑定(内存泄漏),但我想明确地知道如何使用复杂绑定并确保它们不会在随机时间进行垃圾收集,而不需要使用带有污染的类对每个实例的引用.

java javafx java-8 javafx-8

19
推荐指数
1
解决办法
1290
查看次数