嘿,我在网上搜索了一段时间,但我找不到解决以下问题的方法:
在javafx中你有3个基本文件; controller-class,fxml文件和应用程序类.现在我想在控制器中做出反应点击按钮(效果非常好)并更改该点击的屏幕(你通常使用stage.setScreen()),但我没有参考舞台(你可以在应用程序类中找到).
应用程序示例:
public class JavaFXApplication4 extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX application.
* main() serves only as fallback in case the application can not be
* launched through deployment artifacts, e.g., in IDEs with limited FX
* support. NetBeans ignores main().
*
* @param args the command line arguments
*/ …Run Code Online (Sandbox Code Playgroud) 你看到了吗?

每个房子的每块砖都是16x16像素的图像.
您可以在这里看到一个基于简单JavaFX的版本,其中一些Imageview在X和Y上移动以产生"构造"的效果.
我只是将其改编为Swing使用paintComponent.
问题: - 使用JavaFX:我的电脑有问题.您在图片上看到的内容需要2秒才能加载,然后移动速度非常慢且不稳定.- 使用Swing:我不知道如何根据亮度,阴影等调整每个块.所以它看起来像这样:

我应该选择什么方法?两者都有很大的缺点.我本来希望保留JavaFX方法,但也想找到别的东西Imageview.这应该不是一个好主意.
我想在左上角和右上角创建一个带有2个圆角的窗格,我怎么能在javafx中做到这一点?我知道你可以在普通的CSS中使用"border-top-left-radius"但是它不能在javafx下工作.到现在为止我试过:
.calendar {
-fx-border-top-left-radius: 10px;
-fx-border-top-right-radius: 10px;
}
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中创建一个弹出窗口.给我一些想法.

当我点击复选按钮打开弹出窗口.怎么做?
所以这在javafx的例子中起作用,当时我的电脑有jdk 1.7.0,所以这可能是java8中FX的新版本;
我得到了一个很好的堆栈跟踪
jfx-project-run:
Executing E:\workspace\PathFinderApp\dist\run1095471771\PathFinderApp.jar using platform C:\Program Files\Java\jdk1.8.0\jre/bin/java
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
at java.lang.Thread.run(Thread.java:744)
Caused by: javafx.fxml.LoadException:
file:/E:/workspace/PathFinderApp/dist/run1095471771/PathFinderApp.jar!/com/rpg/gui/main.fxml:11
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2617)
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:937)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:976)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:738)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230) …Run Code Online (Sandbox Code Playgroud) 根据: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,就像在上述示例中所做的那样?
使用FXML的JavaFX的MVC模型听起来很棒,但我很难找到如何组织我的项目包.
我发现的关于JavaFX的每一个教程都过于简单和无组织:他们只需创建一个包并在那里创建所有内容,每个控制器,每个fxml,每个css.我不想那样.我希望事情能在正确的位置.
尽管如此,JavaFX的"路径"似乎......"有限".使用URL使得如果我想将资源限制为本地文件,我必须完成所有工作getClass().getResource("foo.fxml").openStream().这很好,但是通过从类路径获取资源,路径来自类所在的包.我有点想要项目的根.这会简化我的生活,但JavaFX似乎并没有像这样工作.
让我们来看一个实际的例子:
想象一下,我有一个FXML"登录屏幕".想象一下,我希望登录屏幕使用样式表.理想情况下,该css将与该fxml位于同一个包中.但是,如果我想在另一个FXML中使用相同的.css呢?这是否意味着我必须将两个FXML放在同一个包中?显然我"不需要",但我该怎么做呢?
另外,假设我想在正确登录时更改场景.在FXML Controller适当的事件中,我将不得不调用"setScene".如果我在不同的包装中使用FXML,那么这条路也很难获得.似乎所有东西都在一个巨大的膨胀包中,或者一切都很难进入而不诉诸"../../dir"之类的黑客.
http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm中的Henley Sales应用程序似乎是一个组织良好的应用程序的示例,尽管该应用程序是单个TabPane.不幸的是(至少我认为)来源不公开.它的想法是这样的:
Run Code Online (Sandbox Code Playgroud)client Main.class styles.css client.images image.png client.screen1 Screen1.fxml Screen1Controller.java client.screen2 Screen2.fxml Screen2Controller.java ...
这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题).
对于'The Henley Sales',它很聪明,有一个Main可以调用其中一个包'FXML(易于访问,FXML的目录在Main类之下).不过,对于样式表,这必须是硬编码的scene.getStylesheets().add(...);.我真的更愿意选择在FXML中选择样式表.Afterall,stylesheet是View组件的一部分.从FXML中的URL访问.css文件对于这种结构来说会有点困难,因为它位于其目录之上.
此外,通过这个组织,我如何才能合理地改变场景?在这个项目中,这不是必需的,因为整个项目是一个TabbedPane.主叫它,它完成了.无需更多交换.但是一个简单的登录场景(或者为什么需要交换整个场景的原因)需要访问FXML路径.
然后是资源.Css文件可能需要使用图像.该结构通过将.css文件放在顶部,并为.css可能需要的文件创建一个包来解决它.如果我想要一个特定的FXML有一个不同的.css,那么,另一个问题就会到来.
这似乎是一个循环.Css需要访问共享资源文件夹.FXML需要访问Css.FXML的控制器需要访问其他FXML.我希望我清楚我的项目结构存在疑虑.请帮我创建一个JavaFX项目结构,该结构对于超过基本的应用程序来说足够强大,或者将我重定向到一些好的源代码.
哦,我顺便使用Netbeans.
是否可以在javafx中使用按钮从另一个fxml打开新的阶段(窗口)?谢谢你的回答.
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属性侦听器和绑定(内存泄漏),但我想明确地知道如何使用复杂绑定并确保它们不会在随机时间进行垃圾收集,而不需要使用带有污染的类对每个实例的引用.