有没有人知道任何基于JavaFX的真实Web应用程序?我是一名经验丰富的Java程序员,考虑在我不在日常工作的时候创建一个网站.我在UI方面没有很多专业知识,因此我正在寻找利用现有技能创建可以提供令人敬畏的RIA体验的最佳方式.唯一的麻烦是,我不知道任何使用JavaFX实现的网站,因为它是如此新颖.我想看看它有什么能力.
我想为JavaFX 8应用程序创建基本的JUnit测试.我有这个简单的代码示例:
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Tabs");
Group root = new Group();
Scene scene = new Scene(root, 400, 250, Color.WHITE);
TabPane tabPane = new TabPane();
BorderPane borderPane = new BorderPane();
for (int i = 0; i < 5; i++) {
Tab tab = new Tab();
tab.setText("Tab" + i);
HBox hbox = new HBox();
hbox.getChildren().add(new Label("Tab" + i));
hbox.setAlignment(Pos.CENTER);
tab.setContent(hbox);
tabPane.getTabs().add(tab);
}
// bind to …Run Code Online (Sandbox Code Playgroud) 我正在使用netbeans在java fxml项目中创建GUI.我想使用bootstrap来设置gui的样式,但我注意到javafx中的所有内容都带有前缀fx-.对于我的项目,还有办法让bootstrap工作吗?bootstrap甚至可以与javafx一起使用吗?
在某些情况下,有必要检测 - 在ListChangeListener中,无需控制列表本身 - "所有数据被换出",当我们需要清除某些状态时选择 - 在全新数据上,旧状态毫无意义.
可以通过以下方式获得完整的新数据
考虑可以在setAll上触发哪种类型的更改(c是更改,items是观察到的列表,"subChangeCount"用于计算子更改的伪代码):
// initially empty
assertEquals(0, items.size());
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasAdded() && !c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
// initially not empty
assertTrue(items.size() > 0);
items.setAll(1, 2, 4);
assertEquals(1, c.subChangeCount());
assertTrue(c.wasReplaced());
assertEquals(0, c.getFrom());
assertEquals(c.getList().size(), c.getAddedSize());
Run Code Online (Sandbox Code Playgroud)
这似乎允许实用程序检查,如:
boolean wasSetOrClearedAll(Change c) {
if (c.getList().isEmpty()) return true;
c.next();
if (c.getAddedSize() == c.getList().size()) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
相比之下,内部fx代码,在收听ComboBox的项目时:
while (c.next()) {
comboBox.wasSetAllCalled = comboBox.previousItemCount == c.getRemovedSize();
...
}
comboBox.previousItemCount = getItemCount();
Run Code Online (Sandbox Code Playgroud)
存储旧的itemCount并将其与当前的removedSize进行比较(我感到很不舒服,旧状态经常因我的口味而变得陈旧),但是我很有可能在我的方法中遗漏了一些东西.
问题是: …
[序言:道歉,这里有很多代码,其中一些可能与这个问题无关,而一些理解问题所必需的代码可能会丢失; 请评论,我会相应地编辑问题.]
环境:Ubuntu 14.10 x86_64; Oracle JDK 1.8u25.单元测试库是TestNG,版本6.8.13; Mockito是版本1.10.17.
在我的GUI应用程序中,JavaFX称之为"控制器"的东西是非常被动的,因为这个"控制器"(我称之为"显示器")真正做的唯一事情就是发送事件.
现在,当收到需要GUI更新的事件时,它是另一个类,我称之为视图,它负责更新GUI.简而言之:
显示 - >演示者 - >视图 - >显示
我有两个单元测试:
所以,我在这方面已经被覆盖了(我可以改变显示器的优势,这就是我这样做的原因).
但现在我尝试测试"视图 - >显示"部分; 我是SOL.
作为说明,这里是视图类:
@NonFinalForTesting
public class JavafxTreeTabView
extends JavafxView<TreeTabPresenter, TreeTabDisplay>
implements TreeTabView
{
private final BackgroundTaskRunner taskRunner;
public JavafxTreeTabView(final BackgroundTaskRunner taskRunner)
throws IOException
{
super("/tabs/treeTab.fxml");
this.taskRunner = taskRunner;
}
JavafxTreeTabView(final BackgroundTaskRunner taskRunner,
final Node node, final TreeTabDisplay display)
{
super(node, display);
this.taskRunner = taskRunner;
}
@Override
public void loadTree(final ParseNode rootNode)
{ …Run Code Online (Sandbox Code Playgroud) 从ObservableLista 中删除项目时,将触发更改事件,其中getFrom()提供删除的位置并getRemoved()提供已删除的项目列表.文件说:
该
getRemoved()方法返回已从列表中替换或删除的元素列表.
它没有这样说,但我暗示项目列表是原始列表中的连续子列表.我已经用这个假设编写了很多代码,但是现在我TreeTableView的选择模型遇到了困难,而这种模式并没有这样做.
以一个带有三个"Node"行的简单树表为例.如果我选择那三行......
...然后单击并选择中间行...
...触发的更改事件treeTableView.getSelectionModel().getSelectedItems()如下所示:
{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0, }
Run Code Online (Sandbox Code Playgroud)
在单个更改事件中,它报告从selectedItems列表的索引0中删除了"节点1"和"节点3" .
我原以为该Change对象有两个由next()调用分隔的独立删除事件.第一次调用next()将告诉我"节点1"在索引0处被删除,第二次调用next()将告诉我"节点3"在索引1处被删除.但是不,我得到一个单独的事件,其中两行都列在一旦.
getRemoved()真的可以退回不连续的物品吗?这是我对列表更改事件如何工作的误解,还是一个错误TreeTableView?
通常我会犹豫是否会责怪标准库,但这不是我在JavaFX中发现的第一个错误,所以这不是不可想象的.
如果我添加一个调用setShowRoot(false),行为会发生变化.我得到了我所期望的,删除分为两部分:
{ [TreeItem [ value: Node 1 ]] removed at 0, [TreeItem [ …Run Code Online (Sandbox Code Playgroud) 我的 JavaFX 应用程序需要能够找到 FXML 文件以加载它们FXMLLoader,以及样式表(CSS 文件)和图像。当我尝试加载这些时,我经常遇到错误,或者我尝试加载的项目在运行时根本没有加载。
对于 FXML 文件,我看到的错误消息包括
Caused by: java.lang.NullPointerException: location is not set
Run Code Online (Sandbox Code Playgroud)
对于图像,堆栈跟踪包括
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
Run Code Online (Sandbox Code Playgroud)
如何找出这些资源的正确资源路径?
由于JFX的媒体方面是开源的,我自己也研究过这个问题,但确实有可能,但需要更改和重建JFX源代码(Java和C部分).这里描述的过程适用于任何想要的人.有一个去 - 我在这个例子中添加了MKV支持,但它应该与其他插件非常相似.
问题的其余部分因此主要是历史性的,但我会留在这里供参考.
到目前为止,我一直在使用VLCJ在我的应用程序中播放视频.它可以工作,但是如果可能的话,我想看看我是否可以通过迁移到JavaFX来实现对常见编解码器的类似级别的支持,并为多个虚拟机节省了很多麻烦,以及VLCJ需要可靠地播放多个视频.我不会在这里讨论,但如果你对细节感兴趣,请看我对这个问题的回答.还有跨平台兼容性的问题,它适用于Mac和Linux,但我还没有弄清楚如何让它在Mac上显示(我相信有一些安全措施可以防止一个进程获得对另一个本机的访问权限)组件,但这又超出了这个问题的范围.)
它可以归结为这样一个事实:虽然它有效,但是如果有另一种解决方案更容易,那么很多维护和麻烦都可以使用多个虚拟机并稳定地将它们连接起来.VLC对于播放几乎任何东西都有相当的传奇支持,这就是为什么我到目前为止已经使用它了,我有兴趣看看我是否可以在JavaFX中得到类似的结果 - 或者至少它是否可以以跨平台的方式提供这样做的手段.
JavaFX 2.0支持视频 - 太棒了!但目前官方的产品线支持"包含VP6视频和MP3音频的FLV".有没有办法扩展它以增加对更多编解码器的支持?没有我想支持的硬编解码器,它更多的是尽我所能,所以我正在寻找一种可扩展的方法来实现上述目标.
我想知道它是否会播放本机安装在机器上的编解码器的视频,并且它本身并不宣传自己(因为该功能显然是依赖于机器而不是跨平台的.)但是没有骰子,我尝试了一个数字常见的格式,除了它陈述的内容之外,它确实拒绝播放任何其他内容.
从查看JavaFX 1.3开始,它还支持其他依赖于平台的编解码器,具体取决于它的安装位置.有没有办法在JavaFX 2中获得这种行为?或者是否计划随后发布?我无法在路线图上找到任何有关它的信息或Oracle的任何评论.
我能从广泛搜索中找到的东西在这里意味着它可能是可能的,但似乎没有人知道如何.我也有兴趣知道它是否基于GStreamer,为什么GStreamer支持的所有格式都不包含在默认值中?
在使用JavaFX播放DVD方面,我绝对无处可去,所以我认为目前这只是一个禁忌.如果有人确实有任何想法或信息,我会全力以赴.
我想知道的一种方法可能是将JMC jar从这里描述的旧JavaFX中删除,并尝试将其与JavaFX 2一起使用.我不认为任何人对这种方法有什么好运或类似的东西?
所有事情都失败了,如果任何人有任何信息或链接,如果/当支持其他编解码器将支持开箱即用,那么我也有兴趣听到这一点.或者,如果有人在Oracle有任何联系方式,我可以要求也会感激!我一直渴望在Java中获得体面的视频支持一段时间,我想这可以归结为是试图弄清楚JavaFX是否是这个的答案,或者只是另一个半心半意的尝试,它永远不会超过它此刻呢!我希望它不是后者,但我还没有看到很多东西来表明情况.
我正在使用JavaFX UI制作一个简单的应用程序,该应用程序只是这样做:
我已经制作了UI并将应用程序放在Sys托盘中,但是我无法使用Normal Actionlistener方法显示/隐藏它,但是我收到了这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
Run Code Online (Sandbox Code Playgroud)
这是代码:
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionListener;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() { …Run Code Online (Sandbox Code Playgroud) 我正在尝试为WinXP 32位系统构建JavaFX应用程序(本机包).
我已经部署了一个WinXP 32位虚拟机.还安装了JDK(jdk-8u65-windows-i586)和InnoSetup以及Netbeans 8.0.2 ......
但是,当我尝试打包为.EXE应用程序时,我收到:
Exception: java.io.IOException: Cannot run program "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\iconswap2855415551655584734.exe": CreateProcess error=193, %1 is not a valid Win32 application
C:\Documents and Settings\Administrator\My Documents\Netbeans Projects\AffideaDicomRouterBasic1_0_0\nbproject\jfx-impl.xml:3415: The following error occurred while executing this line:
C:\Documents and Settings\Administrator\My Documents\Netbeans Projects\AffideaDicomRouterBasic1_0_0\nbproject\jfx-impl.xml:3438: The following error occurred while executing this line:
C:\Documents and Settings\Administrator\My Documents\Netbeans Projects\AffideaDicomRouterBasic1_0_0\nbproject\jfx-impl.xml:1465: The following error occurred while executing this line:
C:\Documents and Settings\Administrator\My Documents\Netbeans Projects\AffideaDicomRouterBasic1_0_0\nbproject\jfx-impl.xml:3093: The following error occurred while executing this line:
C:\Documents and Settings\Administrator\My Documents\Netbeans Projects\AffideaDicomRouterBasic1_0_0\nbproject\jfx-impl.xml:2055: Error: …Run Code Online (Sandbox Code Playgroud)