我想改变一个按钮的样式,这里的大多数线程和互联网上的文章都展示了如何使用Java代码来实现它,我认为这不是一个真正好的解决方案,有没有办法比如说通过仅使用FXML(无Css)设置一个带有一些文本和图像的按钮?
脚本
我正在创建一个GUI,其中多个视图引用相同的模型对象.
我习惯了什么
在Swing中,如果我希望所有视图都引用相同的模型,我会将模型传递给构造函数.
我目前正在做什么
在JavaFX中,我通过在每个视图/控制器加载后在视图/控制器(菜单栏,拆分窗格,制表符......)中设置setter方法来传递模型.我发现这非常俗气和笨重.另外,我发现它不起作用,因为在某些情况下我需要在初始化某些控制器小部件之前模型已经存在于控制器中.
Lackluster Alternatives
(注意:我正在引用这些stackoverflow问题:
依赖注入
将模型对象保存为公共静态变量
将参数从调用者传递到控制器
我希望每个控制器在其构造函数中加载自身,并且我希望每个自定义控制器自动注入其父控制器.例如,卡片概述选项卡会像这样加载自身:
public CardOverviewTab() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("card_overview_tab.fxml"));
fxmlLoader.setRoot(content);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)并且SingleGameSetup控制器将卡概述选项卡自动注入变量:
public class SingleGameSetupController extends AnchorPane {
@FXML private CardOverviewTab cardOverviewTab;
// Rest of the class
}
Run Code Online (Sandbox Code Playgroud)包含卡片概述选项卡的fxml部分如下所示:
<CardOverviewTab fx:id="cardOverviewTab" />
Run Code Online (Sandbox Code Playgroud)这样我不需要担心手动加载控制器,但我仍然有设置模型的问题.
在FXMLLoader上设置控制器
活动巴士
独生子
我在寻找什么
有没有办法以不那么繁琐的方式传递模型对象?我正在寻找一种简单的方法,如将模型传递给构造函数,但我不想处理通过FXMLLoader手动加载控制器,或者在加载控制器后设置模型.也许有一个类来检索模型是最好的选择,但我要求以防万一有更好的方法.
我有我的JavaFX 2.0应用程序,在用户单击ListView元素中的项目后,我需要做一些操作.要构建用户GUI我正在使用FXML,其中我有这样的东西:
<children>
<ListView fx:id="listView" GridPane.columnIndex="0"
GridPane.rowIndex="1" labelFor="$pane"
onPropertyChange="#handleListViewAction"/>
</children>
Run Code Online (Sandbox Code Playgroud)
这是我在控制器中为此事件所拥有的:
@FXML protected void handleListViewAction(ActionEvent event) {
System.out.println("OK");
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误,我接受,当这个gui构建的场景:
javafx.fxml.LoadException: java.lang.String does not define a property model for "property".
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(Unknown Source)
at javafx.fxml.FXMLLoader.processEndElement(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at fxmlexample.FXMLExampleController.handleSubmitButtonAction(FXMLExampleController.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 首先,我是编码领域的新人.我需要在我的基于javaFXML的应用程序中嵌入一个字体,不知道该怎么做.我已经将字体粘贴在fontName.ttf项目源根目录中的"resources"文件夹中,即App/src/app/resources.我已将组件(文本)的CSS设置为
#text {
-fx-font-family: url(resources/fontName.ttf);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在url中添加引号,即url("resources/fontName.ttf");,但它不起作用.我还为组件设置了css id,这样就不会出现问题了.还有其他工作方式吗?我见过http://fxexperience.com/2010/05/how-to-embed-fonts/,但由于我有jdk 1.7 u21,它不起作用.有关正确嵌入字体的方法的想法吗?
我一直在看一些博客和其他stackoverflow问题,我没有看到我的问题的直接答案.我正在创建一个javafx gui客户端,我希望我的菜单栏在一个fxml中是一个控制器,然后我希望内容区域是额外的fxml文件.登录屏幕将是一个fxml,登录屏幕将是应用程序的主要内容,并将在一个fxml中.我该怎么做呢?
我只是不想在同一个文件中拥有我的登录,菜单栏和主要内容的所有代码.这是我正在做的工作的图像:

我正在使用IntelliJ IDEA 13.1.5,我曾经使用Eclipse.我正在研究JavaFX应用程序,我尝试使用getClass().getResource()在我的MainApp类中加载FXML文件.我阅读了文档并尝试了几个想法,最后我得到了null.
这是层次结构:
dz.bilaldjago.homekode.MainApp.java
dz.bilaldjago.homekode.view.RootLayout.FXML
这是我使用的代码片段:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));
Run Code Online (Sandbox Code Playgroud)
我尝试了其他解决方案,例如从root用户提供url并使用classLoader
结果是一样的.请问任何想法
例如,我想在单击按钮时打开DirectoryChooser:
<VBox fx:controller="com.foo.MyController"
xmlns:fx="http://javafx.com/fxml">
<children>
<Button text="Click Me!" onAction="#handleButtonAction"/>
</children>
</VBox>
Run Code Online (Sandbox Code Playgroud)
而Controller类:
package com.foo;
public class MyController {
public void handleButtonAction(ActionEvent event) {
DirectoryChooser dc = new DirectoryChooser();
File folder = dc.showDialog(null);//I want to put the WIndows here.
}
}
Run Code Online (Sandbox Code Playgroud)
我想将主窗口放到ShowDialog中,以便它被阻止但我该如何访问它?
我已设法在父fxml(mainMenu UI)下加载子fxml(子UI).我创建了一个id为"mainContent"的AnchorPane.此窗格绑定到4个方面,并且更改符合舞台.
子窗口将加载到"mainContent"锚定窗格中.但是,我无法弄清楚如何让孩子与其父"mainContent"一起改变.
我的孩子UI就是这样调用的.
@FXML
private void mnuUserLevel_onClick(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("DBedit.fxml"));
loader.setController(new DBeditEntityUserlevel());
try {
Node n = (Node)loader.load();
mainContent.getChildren().add(n);
} catch (IOException e){
System.out.println(e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
为了进一步说明我的问题,请看我的快照.红场就是孩子.黄色方块是MainMenu父级的"mainContent"AnchorPane.

我正在尝试为一个复杂的gui构建一个骨架,因此我的想法是在javafx 2.1中使用mvc样式创建所有内容,因此每个组件都有一个fxml文件,如果需要css,controller和model.我试着弄清楚如何改变子场景(运行时的子fxml).有谁知道怎么做?我有点坚持这个.可以添加MainViewController吗?场景:用户点击任务栏中的按钮,包含的content1.fxml将替换为content2.fxml
这里是基本代码
MainApp.java
Loads the MainView.fxml
Run Code Online (Sandbox Code Playgroud)
MainView.fxml
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<BorderPane xmlns:fx="http://javafx.com/fxml">
<center>
<fx:include source="Content1.fxml"/>
</center>
<bottom>
<fx:include source="TaskBar.fxml"/>
</bottom>
</BorderPane>
Run Code Online (Sandbox Code Playgroud)
Content1.fxml
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content1">
<Label text="Hallo Java FX 2.1.1 Content1.fxml"/>
</StackPane>
Run Code Online (Sandbox Code Playgroud)
Content2.fxml
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content2">
<Label text="Hallo Java FX 2.1.1 Content2.fxml"/>
</StackPane>
Run Code Online (Sandbox Code Playgroud)
TaskBar.fxml
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<HBox xmlns:fx="http://javafx.com/fxml" spacing="10" alignment="center"
fx:id="taskBar" fx:controller="TaskBarController">
<children>
<Button fx:id="taskBarButton1" onAction="#handleTaskBarButton1Action"/>
<Button fx:id="taskBarButton2" onAction="#handleTaskBarButton2Action"/>
</children>
</HBox>
Run Code Online (Sandbox Code Playgroud)
TaskBarController.java
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent; …Run Code Online (Sandbox Code Playgroud) 是否可以在javafx中使用按钮从另一个fxml打开新的阶段(窗口)?谢谢你的回答.