我正在使用Intellij Idea来编译一个使用Maven依赖项的项目,而Intellij一直告诉我,我的项目有50个错误,因为JavaFX不存在.
Intellij没有突出显示我的代码中的所有javafx依赖项作为错误,只是一旦我按下运行并编译程序就说JavaFX中的所有东西都不存在.
我试图重新下载最新的JDK(Java 9.0.1)并且没有修复它.我进入了默认项目结构和项目结构,以确保它使用正确的jdk并且没有解决问题.我正在使用的所有jdks似乎都列出了项目中包含的javafx包.
这也是我与朋友合作的特定项目的问题.我们可能不得不将所有代码移到一个新项目中,但是我不确定这是否会解决任何问题.
有什么建议?
在没有直接和明确替换的情况下排除StyleManager的想法真是太棒了 - 我看到它打破了许多程序!
我需要为整个应用程序(自定义组件,自定义伪类,自定义平台特定的补丁等)进行一些重新设计.在JavaFX 8中,我可以使用:com.sun.javafx.css.StyleManager.getInstance().addUserAgentStylesheet("MyShit.css");
但是在Java 9中,StyleManager不可用.那么有没有办法为每个场景设置CSS?
使用"Application.setUserAgentStylesheet"不是一个选项,因为我不想丢失默认的lookandfeel,我已经调用它来设置MODENA样式.我想扩展默认CSS而不是替换它.我也不想重写整个MODENA(显然).
我真的不想手动为应用程序中的每个表单/场景设置相同的样式表(或将其添加到每个FXML文件).有许多形式,动态构造的对话框.主要原因是,有几个应用程序之间共享的部分(和库),所以我不想硬编码任何样式表(可能有不同的应用程序的名称和路径).
所以我需要一种方法在程序的一个点为应用程序的每个可能场景设置一个额外的样式表.FX9有可能吗?
PS我研究了自定义FXML加载器,CSS加载器,场景加载器和拦截场景创建的其他方法 - 没有办法!
在Java 8中,我可以使用以下方法使用预加载器启动JavaFX应用程序:
LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader.class,
new String[]{...});
Run Code Online (Sandbox Code Playgroud)
我更喜欢从代码开始,如上所述,而不是使用部署配置,因为我不希望每次启动应用程序时都启动图形界面,但只有在计算出应用程序运行的某些代码之后GUI模式.
我使用的是"com.sun.javafx.application.LauncherImpl"类,但显然在Java 9中,所有以"com.sun"开头的类都被删除了.那么,如何在Java 9中使用预加载器启动应用程序?
我在两个文件中有两个JPMS模块:modulea.jar和moduleb.jar.Modulea需要javafx.controls模块.我需要在新层中使用这些模块,所以我这样做:
ModuleFinder finder = ModuleFinder.of(modAPath, modBPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolveAndBind(finder, ModuleFinder.of(), new HashSet<>());
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer newLayer = parent.defineModulesWithOneLoader(cf, scl);
Run Code Online (Sandbox Code Playgroud)
我认为JDK模块会自动加载,但我得到了
Exception in thread "main" java.lang.module.FindException: Module javafx.controls not found, required by modulea
at java.base/java.lang.module.Resolver.findFail(Resolver.java:889)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
at java.base/java.lang.module.Resolver.bind(Resolver.java:297)
at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:428)
at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:230)
Run Code Online (Sandbox Code Playgroud)
在我这样做的同时:java --list-modules,输出是:
...
javafx.base@9
javafx.controls@9
javafx.deploy@9
javafx.fxml@9
javafx.graphics@9
javafx.media@9
javafx.swing@9
javafx.web@9
Run Code Online (Sandbox Code Playgroud)
怎么解决?
我有一个ListView,想要以编程方式选择多个索引 Platform.runLater()
问题:如果我想要选择的索引是顺序的(例如{5,6,7}),则选择工作正常.如果存在间隙(例如{5,7,8}),则抛出OOB异常.
java.lang.IndexOutOfBoundsException: [ fromIndex: 0, toIndex: 5, size: 3 ]
Run Code Online (Sandbox Code Playgroud)
我相信Java9中可能存在一个错误(这个异常在我们从Java8升级到9之后就开始出现了)MultipleSelectionModelBase#set.
对于索引{5,6,7},该方法调用_nextAdd(from, to)值0和3.(0包含,3独占,我假设指的是我的数组中的索引0,1,2 {5,6,7})
对于指数{5,7,8},它要求_nextAdd(0,2)对{5}与_nextAdd(2,5)该指数{7,8}.
我认为应该改为_nextAdd(0,1)与_nextAdd(1,3)因为我的阵列只有3个要素,而不是5.
使用参数0,5 javafx.collections.ListChangeListener#getAddedSubList调用时最终会抛出异常getList().subList(getFrom(), getTo())
我搜索了错误报告,但无法找到有关此问题的任何信息.
在提交错误报告之前,我想我会问这里.
MVCE
启动程序,单击"选择578"按钮.抛出(并捕获)异常:[fromIndex:0,toIndex:5,size:3]
要么
注释掉"clearSelection"行.
启动程序,单击"选择567",然后单击"选择578".
抛出(并捕获)异常:[fromIndex:8,toIndex:9,size:4]
package sample;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends …Run Code Online (Sandbox Code Playgroud) 我尝试在 Ubuntu 16.04.3 LTS 上使用 OpenJDK 9 编译来自Oracle 的 JavaFX HelloWorld 演示,但它不起作用:
$ javac -version
javac 9-internal
$ javac HelloWorld.java
HelloWorld.java:3: error: package javafx.application does not exist
...
Run Code Online (Sandbox Code Playgroud)
我在包管理器中找不到 Java 9 的 OpenJFX 包。现有的仅适用于 OpenJDK 8(我尝试安装它,但没有帮助):
$ apt-cache search openjfx
...
openjfx - JavaFX/OpenJFX 8 - Rich client application platform for Java
...
Run Code Online (Sandbox Code Playgroud)
我是否必须从源代码安装 JavaFX 才能在 Ubuntu 上使用 OpenJDK 9 编译 JavaFX 应用程序?
我需要重新编译java应用程序,在Java 8上编写.App使用com.sun.javafx.collections.ObservableListWrapper类,但在编译java 9时出现错误:
Error:(3, 22) java: package com.sun.javafx.collections is not visible
(package com.sun.javafx.collections is declared in module javafx.base, which does not export it to the unnamed module)
Run Code Online (Sandbox Code Playgroud)
我可以使用哪个班而不是ObservableListWrapper?或者如何绕过这个问题?
我想暂停JavaFX应用程序线程上方法的执行,然后等待用户与UI进行交互。重要的是不要冻结UI。
例:
Button start = ...
Button resume = ...
start.setOnAction(evt -> {
System.out.println("starting");
start.setDisable(true);
System.out.println("please press resume button.");
pause();
System.out.println("done");
start.setDisable(false);
});
resume.setOnAction(evt -> resume());
Run Code Online (Sandbox Code Playgroud)
我应该如何实现pause()和resume()方法?
事件处理程序的执行应在pause();调用之前等待,直到用户按下resume按钮并调用了该resume方法为止。
我在Java 8中启动了一个Maven项目,并希望将其迁移到Java 9.同时我也从Eclipse Neon EE转到Eclipse Oxygen EE.(重新安装JFX SDK).虽然Eclipse Workspace没有显示任何错误; 一旦我尝试编译并运行以前在Java 8中运行完全正常的完全相同的程序,我得到以下异常:
{...}
Caused by: java.lang.ClassNotFoundException: com.sun.javafx.css.converters.PaintConverter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 26 more
Run Code Online (Sandbox Code Playgroud)
运行应用程序应用程序的异常.主要
我现在已经多次重建了这个项目,无法让它工作......
我现在的Eclipse是Oxygen.2 Release(4.7.2),还有Java 9.0.1.基本上Java 9工作,特别是自动导入工作(对于"普通"类和包),但自动导入(和自动完成)不起作用javafx.*.如果我手动输入import java并按Ctrl+ Space,则弹出匹配包列表,我可以看到javafx.*层次结构.但是当我输入eg import javafx.stage并按Ctrl+时Space它会自动添加.*;并且不会显示包中的任何类.当我Stage在方法体中的某处键入并按Ctrl+时Space,没有任何建议.但是,当我键入添加导入(如import javafx.stage.Stage)时,代码编译并运行.
任何线索如何修复自动完成和自动导入功能(正如我所说,适用于其他类,例如java.time.LocalDateTime或许多其他类).
如何在JavaFX 9的TableView中获取可见行的索引?在JavaFX 8中,我可以执行以下操作:
// --- The offending imports in Java 9
// import com.sun.javafx.scene.control.skin.TableViewSkin;
// import com.sun.javafx.scene.control.skin.VirtualFlow;
/**
* This is a total hack. We need it as scrollTo jumps the selected
* row to the top of the table. Jarring if the row is already
* visible. As a workaround, we only scroll if the row isn't already
* visible
*
* @return A 2 element ray with the start and end index of visible rows
*/
public int[] …Run Code Online (Sandbox Code Playgroud) 我目前正在创建一个简单的 javafx 应用程序,并希望制作一个“检查更新”按钮。
当这个按钮被按下时,它会检查任何可用的更新。如果它确实找到了,它会提示用户并请求允许更新自身。
如何实施?
注意:如果这有用的话,我使用的是 Java 9,而不是 8。