Tag: javafx

在Eclipse外运行jar时未加载FXML布局

我尝试加载我的fxml布局文件,如下所示: FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource(“view/MainLayout.fxml”)); AnchorPane personOverview = (AnchorPane) loader.load(); 当我在Eclipse中运行应用程序时都可以工作,但是当我使用Ant部署应用程序时,我遇到了一个错误: 构建项目后,我的文件夹结构是: 在部署的jar中也一样 我知道在jar和eclipse中解析路径可能存在差异,但我无法解决这个问题。 我使用Java 1.8和JavaFX 8。 更新1根据错误我认为它使用绝对URL解析路径(以文件:/ C:/ …开头),但应该在jar文件中使用相对URL。 为什么它使用绝对路径是主要问题。 更新2 有趣的是根布局成功加载,使用相同的代码.. FXMLLoader loader = new FXMLLoader(); loader.setLocation(MainApp.class.getResource(“view/RootLayout.fxml”)); rootLayout = (BorderPane) loader.load(); 但内部布局初始化失败。 堆栈跟踪: java -jar MeterChecker.jar javafx.fxml.LoadException: unknown path at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.load(Unknown Source) at com.wolf6969.checker.MainApp.showMain(Unknown Source) […]

JavaFX在FXML文档中编辑WebView

我的目标是能够使用控制器类将html内容放入fxml文档中的WebView对象。 我的FXML文档中还有其他对象,如按钮和图像,我希望WebView只是GUI的一部分。 我可以使用控制器类将内容放在FXML文档中的TextArea中。 为WebView执行此操作有点棘手,因为它需要WebEngine才能使用它。 我知道如何在没有FXML文档的情况下自行启动WebView,但有人知道我的目标是否可以实现? 这是我在控制器类中的尝试,但是我得到了一个调用目标exception: public class FXMLDocumentController implements Initializable { @FXML private Label label; WebEngine engine; @FXML private void handleButtonAction(ActionEvent event) { System.out.println(“You clicked me!”); label.setText(“Hello World!”); } //access WebView in FXML document @FXML WebView mywebview; //mywebview is the fxid public void displayWeb() { engine = mywebview.getEngine(); final String hellohtml = “chang.htm”; //HTML […]

使JavaFX TableView行无法选择和NoFocusTraversable

我试图使JavaFX行无法选择, NoFocusTraversable但我没有运气这样做。 下面是您可以用来玩它的另一个问题的代码。 我添加了两个自定义行,使某些行no focus traversable 。 虽然我不能让某些行无法unselectable ,但任何想法? 您需要下载TomasMikula / EasyBind库(或注释上面的行并取消注释RowFactory ) 代码来自( JavaFX:如何禁用TableView中的行? )StackOverflow答案: import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.function.Function; import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ContentDisplay; import javafx.scene.control.TableCell; import […]

JavaFX没有调用main(String args)方法

我开发了可以作为GUI执行的GUI , CLI依赖于提供的参数。 这是应用程序类: public class Main extends Application { public static void main(String[] args) { if (args != null && args.length > 0 && args[0].equals(“cli”)) { String pathToProperties = args[1]; Cli cli = new Cli(pathToProperties); cli.loadPropertiesAndGenerateApk(); } else { launch(args); } } @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = new […]

自动单击JavaFX Webview中的按钮

我正在使用一个可以自动登录某些网站的JavaFX Web浏览器,我知道如何将数据设置为用户名和密码字段但是如何让它执行登录按钮点击? 这是我到目前为止所得到的: String email = “document.getElementsByName(’email’)[0].value=’MY_EMAIL’;”; String pass = “document.getElementsByName(‘pass’)[0].value=’MY_PASSWORD’;”; String login = “”; webEngine.executeScript(email); webEngine.executeScript(pass); webEngine.executeScript(login); 这是它应该点击的按钮的javascript代码:

打破听众的递归

我试图打破一个使这段代码递归的特殊情况。 我有一个Javafx游戏,其中有人和计算机玩家在轮到他的时候玩,并且可以有很多回合。 计算机应该自动播放并立即移动到下一个播放器并且不向UI显示任何直接指示(但是可以查看它之后做了什么)。 问题是在只有电脑玩家的情况下,我们会在当前装载电脑的时候来到这里,输入条件,因为所有玩家都是电脑,设置下一个播放器的电路板,然后无需完成通话,请拨打此电话同样的function: currentBoardPane.addListener((e) -> { if(gameManager.checkIfCurrentPlayerIsComputer()){ gameManager.playAutoMovesForCurrentPlayer(); gameManager.setNextPlayer(); // it does current player property = next player //update board on scene currentBoardPaneIndex = ((currentBoardPaneIndex + 1) % gameManager.getPlayers().size()); currentBoardPane.setValue(boardPanes.get((currentBoardPaneIndex))); //this is a recursive call } }); 取而代之的是,如果我在GameManager为currentPlayer属性订阅一个监听器,那么我仍然需要从该监听器调用setNextPlayer() ,这又是递归的。 如果所有玩家都是计算机,我可以制作一个特例,然后从一段while(true){}而不是听众和绑定运行游戏,但必须有更好的方法来打破这种递归。 还有一种方法是在没有听众和绑定的情况下不进入递归吗? 笔记: currentBoardPane表示屏幕上的当前游戏板,它是一个ObjectProperty 。

加载到JavaFX WebView组件中的完整网页的屏幕截图,不仅是可见部分

经过两年的管理工作后,我正在编写我的第一行代码。 没有时间阅读很多文档,需要在几分钟内创建一个概念validation。 因此,我必须使用JavaFX,并且需要提供允许将Web页面加载到WebView组件中的屏幕截图的function。 问题是我需要整页的屏幕截图,而不仅仅是适合当前应用程序窗口大小的那个。 这是我使用的简单代码: WritableImage image = browser.snapshot(new SnapshotParameters(), null); // browser is javafx.scene.web.WebView File file = new File(“screenshot_fx.png”); try { ImageIO.write(SwingFXUtils.fromFXImage(image, null), “png”, file); } catch (IOException e) { e.printStackTrace(); } 它基本上只捕获我在屏幕上看到的内容。 如果网页需要滚动 – 我将不会在屏幕截图上显示不可见的部分。 请建议如何进行。

如何在TableView中获取特定点的行号?

我在JavaFX中创建TableView 。 我想在鼠标右键单击显示Context Menu 。 所以我按照下面给出的那样做。 EventHandler event = new EventHandler() { @Override public void handle(MouseEvent me) { if (me.getButton() == MouseButton.SECONDARY) { tableView.getContextMenu().show(tableView, me.getSceneX(), me.getSceneY()); } } }; tableView.addEventHandler(MouseEvent.MOUSE_CLICKED, event); 但我想这样做只有在我点击TableView任何行时,才能看到Context Menu 。 即如何在TableView中获取特定点的行号,这样我的Context Menu应该只有可见,如果我点击TableView任何一行。

窗格形状修改

好吧,总而言之,我试图创建一种聊天/消息系统并需要一些帮助。 我正在尝试在容器上创建一个箭头,如下图所示。 图像从ControlsFX和PopOver窗口中取出。 我不能使用他们的popover小部件,因为它与我正在使用它的行为有点不稳定。 我继续创建了我自己的小聊天窗口弹出窗口,它将自己定位在我定义的父对象上,但我真的希望它有一个指向对象的箭头。 箭头也将始终面朝下,应位于弹出窗口的左下角。 还应该注意的是,弹出窗口不是一个窗口,它是一个用文本行填充的简单VBox。 如果需要的话,我当然可以将它包装在Pane中。 任何人都可以提出创建此箭头的正确方法吗? 我也把我的VBox背景作为渐变,所以箭头不能像通过getChildren()一样在底部,添加“相同颜色”,因为渐变会关闭。 它必须(某种程度上)是容器的一部分。 ================================================== =========================编辑: 好吧所以我今天花了大部分时间学习SVG Pathing,这不是太复杂但是有点单调乏味。 我最终走的路是: “M30 0 h100 a6,6 0 0,1 6,6 v50 a6,6 0 0,1 -6,6 h-88 L38 68 L34 62 h-4 a6,6 0 0,1 -6,-6 v-50 a6,6 0 0,1 6,-6 z” 现在唯一的问题是箭头尾部高度随着窗格的大小而增长。 例如,如果框中有很多文本,窗格会增加高度(当然),箭头也会变长。 这种行为不是一个彻底的交易破坏者,但它并不是我的意图。 我期望在路径中的资本Ls确保箭头的点数无论什么都保持不变,但它不起作用。 有什么想法吗?

JavaFX中TilePane中的字母可视化

我需要做什么: 我试着编写一些代码来可视化任何角色的每个像素。 我决定最好的方法是在Tile Pane中将像素显示为矩形。 所以这是我需要达到的效果: 我的问题是什么: 我写了一些代码,通过使用text1 snaphost并将其保存为WritableImage 。 然后我使用PixelReader通过argb方法读取该图像的每个像素。 在循环中,当每个整数rgb值大于TRESHOLD(更亮)时,我添加带有白色背景的新图块。 除非我添加黑色背景的瓷砖。 但是我的想法仍然有问题,我得到了这个效果: 有我的代码: public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ //Create single letter string String letter = “a”; //Create new text Text text1 = new Text(letter); //Set font for text text1.setFont(Font.font(“Calibri”, FontWeight.NORMAL, 12)); //Save text1 as writable image […]