标签: fxml

JavaFX项目结构

使用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.不幸的是(至少我认为)来源不公开.它的想法是这样的:

client
  Main.class
  styles.css
      client.images
          image.png
      client.screen1
          Screen1.fxml
          Screen1Controller.java
      client.screen2
          Screen2.fxml
          Screen2Controller.java
      ...
Run Code Online (Sandbox Code Playgroud)

这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题).

对于'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.

css javafx organization java-8 fxml

19
推荐指数
1
解决办法
2万
查看次数

如何引用primaryStage

我将.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存储在某些静态上下文中,但这似乎不是一种对我这样做的方法.

java javafx javafx-2 fxml

18
推荐指数
2
解决办法
3万
查看次数

使用JavaFX引导程序

我正在使用netbeans在java fxml项目中创建GUI.我想使用bootstrap来设置gui的样式,但我注意到javafx中的所有内容都带有前缀fx-.对于我的项目,还有办法让bootstrap工作吗?bootstrap甚至可以与javafx一起使用吗?

css netbeans javafx twitter-bootstrap fxml

18
推荐指数
2
解决办法
2万
查看次数

开始使用Scala + 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窗口?

scala javafx fxml

17
推荐指数
1
解决办法
1万
查看次数

Action上的Java FX fxml

我想在我的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)

java action javafx fxml

17
推荐指数
1
解决办法
4万
查看次数

FXMLLoader getController返回NULL?

我有主要的应用程序类,可以执行以下操作:

   @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)

javafx fxml

17
推荐指数
1
解决办法
3万
查看次数

如何通过调整组件大小来绑定舞台大小调整?

我有一个带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)

所以有两个问题:

  • 要进行一些绑定,我必须在控制器类中获得我的舞台.那么 - 我怎样才能在控制器类中获得一个阶段?
  • 它看起来像UI控件没有任何width\height属性,绑定到某些东西.或许我还没找到它们.

那么,我该如何解决我的问题呢?

UPD.关于Scene Builder到Sergey Grinev:当我在我的组件上使用 Ctrl + K(告诉它占据其父组件的整个区域)时 - 一切正常.

但是如果我想告诉我的组件占据50%的面积呢?例如,我有一个带有两个VBox的标签.标签的宽度为100px.Vbox的宽度分别为50px.VBox1的x1 = 0,x2 = 50,VBox2的x1 …

javafx javafx-2 fxml

16
推荐指数
2
解决办法
6万
查看次数

ComboBox FXML默认值

如何在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编辑列出的项目?我似乎找不到它.

java combobox javafx javafx-2 fxml

16
推荐指数
3
解决办法
3万
查看次数

TextField中的RequestFocus不起作用

我使用JavaFX 2.1并使用FXML创建了GUI,在我添加的GUI的控制器中myTextField.requestFocus();.

但我总是把焦点放在另一个控件上.

java javafx-2 fxml

15
推荐指数
3
解决办法
2万
查看次数

如何从ToggleGroup获取选定的单选按钮

我正在研究JavaFX 8和SceneBuilder.我在FXML文件中创建了一些单选按钮,并toggleGroup为其中的单选按钮列表指定了一个名称.所以,现在我想toggleGroup在我的控制器中选择所选的单选按钮,我是否需要将所有单选按钮再次作为控制器中的字段,或者只是toggleGroup对象将获得所选单选按钮(该单选按钮的文本)仅按钮,而不是按钮对象).

javafx fxml

15
推荐指数
3
解决办法
5万
查看次数