使用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.
我将.fxml-Files用于我的应用程序的视图层.每个fxml都附有一个控制器
<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">
Run Code Online (Sandbox Code Playgroud)
我们假设我有一个mainFrame和它的控制器.mainFrame.fxml加载在start(Stage)-method中.
现在你要显示一个附加到Stage/Window/Whatever的fileChooser.
为此,让fxml-controller知道例如 primaryStage.
有没有办法将它注入控制器,或者FXML在运行时是否知道它属于哪个场景和阶段?
我只有想法是将primaryStage存储在某些静态上下文中,但这似乎不是一种对我这样做的方法.
我正在使用netbeans在java fxml项目中创建GUI.我想使用bootstrap来设置gui的样式,但我注意到javafx中的所有内容都带有前缀fx-.对于我的项目,还有办法让bootstrap工作吗?bootstrap甚至可以与javafx一起使用吗?
是否有一些指南或演练来构建Scala + JavaFX桌面应用程序?
我很难找到一个好的来源,我使用IntelliJ IDEA作为IDE.
即使是最简单的桌面问候世界样本也会有很大帮助,因为我几乎无法从哪里开始.
更新:这就是我现在拥有的:
import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.layout.StackPane
import javafx.stage.Stage
import javafx.scene.control.Label
class Test extends Application {
override def start(primaryStage: Stage) {
primaryStage.setTitle("Sup!")
val root = new StackPane
root.getChildren.add(new Label("Hello world!"))
primaryStage.setScene(new Scene(root, 300, 300))
primaryStage.show()
}
}
object Test {
def main(args: Array[String]) {
val t = new Test
t.start(new Stage)
}
}
Run Code Online (Sandbox Code Playgroud)
运行它我得到:
线程"main"中的异常java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = main
如何让它显示带有标签的hello world窗口?
我想在我的Controller班级中定义的按钮中添加一个方法
在控制台中只是一个错误,告诉我它找不到该方法
这是代码
sample.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="sample.Controller">
<children>
<Button layoutX="126" layoutY="90" text="lololol" onAction="#test" fx:id="button" />
</children>
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)
和Controller.java
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import java.awt.event.ActionEvent;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable
{
@Override
public void initialize(URL url, ResourceBundle resourceBundle)
{
}
@FXML
private void test(ActionEvent event)
{
System.out.println("lollolol");
}
}
Run Code Online (Sandbox Code Playgroud) 我有主要的应用程序类,可以执行以下操作:
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
"RecordScreen.fxml"));
Parent root = (Parent) loader.load();
Scene newScene = new Scene(root);
Stage newStage = new Stage();
newStage.setScene(newScene);
newStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
它启动一个显示人物的表格视图.我选择一个人,点击编辑按钮,然后尝试启动一个允许我编辑它们的窗口.
@FXML
public void editPerson() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
"PersonEditor.fxml"));
PersonEditorCtrl ctrl = loader.getController();
ctrl.init(table.getSelectionModel().getSelectedItem());
Parent root = (Parent) loader.load();
Scene newScene = new Scene(root);
Stage newStage = new Stage();
newStage.setScene(newScene);
newStage.show();
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 我有一个带FXML的JavaFX 2.0应用程序.我希望在调整带有应用程序的窗口时调整组件(TextFields,ComboBoxes,layouts等)的大小.所以...
使用JavaFX构建GUI应用程序时,您会注意到API中的某些类已经实现了属性.例如,
javafx.scene.shape.Rectangle类包含的属性arcHeight,arcWidth,height,width,x,和y.对于这些属性中的每一个,将存在与先前描述的约定匹配的对应方法.例如getArcHeight(),setArcHeight(double),arcHeightProperty(),它们共同表明(对开发人员和工具)给定的属性存在.*
要将监听器添加到舞台,我必须执行以下操作:
stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
throw new UnsupportedOperationException("Not supported yet.");
}
});
Run Code Online (Sandbox Code Playgroud)所以有两个问题:
那么,我该如何解决我的问题呢?
UPD.关于Scene Builder到Sergey Grinev:当我在我的组件上使用 Ctrl + K(告诉它占据其父组件的整个区域)时 - 一切正常.
但是如果我想告诉我的组件占据50%的面积呢?例如,我有一个带有两个VBox的标签.标签的宽度为100px.Vbox的宽度分别为50px.VBox1的x1 = 0,x2 = 50,VBox2的x1 …
如何在ComboBox使用FXML中设置默认值?
<ComboBox fx:id="cbo_Bacteriologie_Aesculine" prefHeight="21.0" prefWidth="105.0" GridPane.columnIndex="1" GridPane.rowIndex="0">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="NVT" />
<String fx:value="Bezig" />
<String fx:value="Positief" />
<String fx:value="Negatief" />
</FXCollections>
</items>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
我希望NVT默认选中.我尝试添加selected="selected",但似乎没有找到正确的语法.
是否可以使用Scene Builder编辑列出的项目?我似乎找不到它.
我使用JavaFX 2.1并使用FXML创建了GUI,在我添加的GUI的控制器中myTextField.requestFocus();.
但我总是把焦点放在另一个控件上.
我正在研究JavaFX 8和SceneBuilder.我在FXML文件中创建了一些单选按钮,并toggleGroup为其中的单选按钮列表指定了一个名称.所以,现在我想toggleGroup在我的控制器中选择所选的单选按钮,我是否需要将所有单选按钮再次作为控制器中的字段,或者只是toggleGroup对象将获得所选单选按钮(该单选按钮的文本)仅按钮,而不是按钮对象).