我想从我的控制器类处理阶段事件(即隐藏).所以我要做的就是通过添加一个监听器
((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);
Run Code Online (Sandbox Code Playgroud)
但问题是初始化刚刚开始
Parent root = FXMLLoader.load(getClass().getResource("MyGui.fxml"));
Run Code Online (Sandbox Code Playgroud)
之前
Scene scene = new Scene(root);
stage.setScene(scene);
Run Code Online (Sandbox Code Playgroud)
因此.getScene()返回null.
我自己找到的唯一解决方法是向myPane.sceneProperty()添加一个监听器,当它变为非null时,我得到场景,添加到它的.windowProperty()我的!该死!我最终检索阶段的监听器处理.这一切都以设置所需的听众来举办舞台活动而告终.我认为听众太多了.这是解决我问题的唯一方法吗?
我今天已经下载了OpenJDK 8 sudo apt-get install openjdk-8-jdk,似乎JavaFX不包含在其中.
> java -version
openjdk version "1.8.0_66-internal"
OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)
OpenJDK Server VM (build 25.66-b17, mixed mode)
Run Code Online (Sandbox Code Playgroud)
我也在最新的Eclipse(Eclipse Mars)中安装了E(fx)clipse,但我仍然得到消息javafx无法解析.
当我在新的java 8项目中尝试使用与javafx相关的类时,我从eclipse中获得了访问限制错误.到目前为止,我能找到的唯一"解决方案"是告诉eclipse忽略访问限制,但我对此并不满意.错误的一个例子:
Access restriction: The type Pane is not accessible due to
restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar
Run Code Online (Sandbox Code Playgroud)
我正在使用Eclipse Kepler和Java 8的Eclipse JDT补丁.
这似乎是与JavaFX不是JavaSE执行环境的一部分有关的问题.
我现在很困惑,因为根据http://en.wikipedia.org/wiki/JavaFX,javaFX是JavaSE的一部分.是否有可能Eclipse没有认识到它是javaSE的一部分?
我需要将输入限制为TextField为整数.有什么建议?
我一直在研究这个问题,但至少我还是非常困惑.
谁能给我一个何时使用Task和何时使用的具体例子Platform.runLater(Runnable);?究竟有什么区别?什么时候使用其中任何一个是否有黄金法则?
如果我错了也不纠正我,但这两个"对象"不是在GUI中用于更新GUI的主线程内创建另一个线程的方法吗?
以下是两张PNG图片:
在视觉上它们完全相同 - 唯一的区别是在某些像素中有一个半透明背景(您可以下载图像进行检查).
但是当我在JavaFX节点上使用这些图像作为图像光标时,我得到以下结果:
第一个光标(没有部分透明像素)仍然很清晰,但第二个光标变形.
在与问题斗争了一段时间之后,我发现了解决这种差异的算法 - 混合模式:
"预期"方式(例如,您可以在此浏览器中看到)是获取每个通道的值之和,按Alpha值加权:(1 - alpha) * background_color + alpha * foreground_color.
"JavaFX Cursor"给出了不同的公式:( (1 - alpha) * background_color + alpha^2 * foreground_color注意方形).
我发现了失真,但我无法弄清楚我做错了什么以及如何纠正这个问题.
这是我测试程序的完整可运行源代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.ImageCursor;
import javafx.scene.image.Image;
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
System.out.println(ImageCursor.getBestSize(32, 32));
primaryStage.setTitle("Hello World!");
StackPane root = new StackPane();
root.setCursor(new ImageCursor(new Image("/test-cursor.png"), …Run Code Online (Sandbox Code Playgroud) 在JavaFX中,如果我有一个包含2个VBox元素的场景,并且每个元素VBox都有多个元素Label.
如果我将顶部设置VBox为隐形,为什么底部VBox 不会移动到顶部的场景VBox?
这VBox是看不见的,但我希望其他对象移动到它的位置.
我正在使用FXML来加载我的控件.
所以,在JavaFX上磨牙,到目前为止事情正在顺利进行.
但是,所有文本字段都有一条线穿过它们,从顶部开始大约10px.
不仅在我的应用程序中,而且在SceneBuilder应用程序中也是如此.
注意,我没有使用任何显式CSS,我不知道SceneBuilder使用什么.屏幕截图来自SceneBuilder,我的屏幕看起来完全相同.

所以,这是基本的东西.
java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
在Mac OS 10.9.5上
只是好奇,如果有人看到这个并有一个建议.
编辑:我下载了样本,这显然与Modena主题有关.Caspian主题看起来很好.以下是Modena.jar TextFields部分的屏幕截图.有趣的是,它TextArea遇到了类似的问题,尽管并不像普遍的那样普遍TextField.

更多附录:
人们一直在争吵,所以这就是.我基本上只是遵循这个:https://docs.oracle.com/javafx/2/get_started/form.htm并使用默认的Netbeans 8.0.2 JavaFX应用程序项目.只需从网站上剪切并粘贴即可.
public class Fxlinetest extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX Welcome");
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(25, 25, 25, 25));
Text scenetitle = new Text("Welcome");
scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
grid.add(scenetitle, …Run Code Online (Sandbox Code Playgroud) 在Swing中,您只需setDefaultCloseOperation()在窗口关闭时关闭整个应用程序即可.
但是在JavaFX中我找不到相应的东西.我打开了多个窗口,如果窗口关闭,我想关闭整个应用程序.在JavaFX中这样做的方法是什么?
编辑:
我明白我可以覆盖setOnCloseRequest()在窗口关闭时执行一些操作.问题是应该执行什么操作来终止整个应用程序?
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
stop();
}
});
Run Code Online (Sandbox Code Playgroud)
类中stop()定义的方法Application什么都不做.
我的Application班级看起来像这样:
public class Test extends Application {
private static Logger logger = LogManager.getRootLogger();
@Override
public void start(Stage primaryStage) throws Exception {
String resourcePath = "/resources/fxml/MainView.fxml";
URL location = getClass().getResource(resourcePath);
FXMLLoader fxmlLoader = new FXMLLoader(location);
Scene scene = new Scene(fxmlLoader.load(), 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
通过先调用默认构造函数然后调用方法,FXMLLoader创建相应控制器的实例(在FXML文件via中给出fx:controller)initialize:
public class MainViewController {
public MainViewController() {
System.out.println("first");
}
@FXML
public void initialize() {
System.out.println("second");
} …Run Code Online (Sandbox Code Playgroud)