我怎样才能捕获fxml组合框的选定值并将其实现到javafx类中?
我给了组合框fx:id"sample"并创建了一个onAction ="#test"的按钮,并尝试了.getValue和.getPromptText.
@FXML private ComboBox<String> Sample;
@FXML protected void test( ActionEvent event ) {
String output = (String) Sample.getValue();
System.out.println(output);
String output = (String) Sample.getPromptText();
System.out.println(output);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试运行它我会收到一个错误:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Node.fireEvent(Node.java:6863)
at javafx.scene.control.Button.fire(Button.java:179)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at …Run Code Online (Sandbox Code Playgroud) 我有以下FXML:
<ChoiceBox>
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="2 minutes" />
<String fx:value="5 minutes" />
<String fx:value="15 minutes" />
</FXCollections>
</items>
</ChoiceBox>
Run Code Online (Sandbox Code Playgroud)
但是在GUI中它只显示一个默认为nothing的ChoiceBox.我希望列表中的第一个元素是默认值,并且选择"null"或者不禁止任何内容.
我该如何做到这一点?
我已经在FXML文件中的Label和相关控制器中的IntegerProperty之间建立了数据绑定.问题是,虽然标签在初始化时设置为正确的值,但是当属性的值更改时它不会更新.
FXML文件
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<GridPane xmlns:fx="http://javafx.com/fxml"
fx:controller="application.PaneController" minWidth="200">
<Label id="counterLabel" text="${controller.counter}" />
<Button translateX="50" text="Subtract 1"
onAction="#handleStartButtonAction" />
</GridPane>
Run Code Online (Sandbox Code Playgroud)
调节器
package application;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.binding.Bindings;
import javafx.beans.property.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
public class PaneController implements Initializable
{
private IntegerProperty counter;
public int getCounter()
{
return counter.get();
}
public void setCounter(int value)
{
counter.set(value);
}
public PaneController()
{
counter = new SimpleIntegerProperty(15);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我有一个用NetBeans 8编写的JavaFX/Java 8应用程序(否SceneBuilder).
我的应用程序有一个主窗口,它有自己的FXML文件(primary.fxml)和它自己的控制器类(FXMLPrimaryController.java).FXML中的一个项目是TextArea.FXMLPrimaryController.java中的一些方法是关于附加的TextArea.
此应用程序现在生成第二个窗口(另一个"阶段"),其中包含自己的FXML(second.fxml)和自己的控制器类(FXMLsecondController.java).
在第二个控制器类中,如何访问主要的TextArea?
以下是相关代码的示例:
primary.fxml:
<Button text="press me!" onAction="#openSecondWindow" />
<TextArea fx:id="myArea" />
Run Code Online (Sandbox Code Playgroud)
FXMLPrimaryController.java:
public class FXMLPrimaryController implements Initializable {
@Override
public void initialize(URL url, ResourceBundle rb) {
}
@FXML private TextArea myArea;
final public void writeToTextArea() {
myArea.appendText("hi!");
}
@FXML
private void openSecondWindow(ActionEvent event) throws Exception {
Group root = new Group();
Stage stage = new Stage();
AnchorPane frame = FXMLLoader.load(getClass().getResource("second.fxml"));
root.getChildren().add(frame);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
} …Run Code Online (Sandbox Code Playgroud) 我只是在试用JavaFX并且正在强行进入它,因为它被认为是未来.我正在尝试创建一个包含4列的表.列和表应调整大小以填充父窗格.我不能为我的生活让这个工作.我现在已经尝试了4个多小时,并且tableview没有调整大小.
这是我的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.*?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.collections.*?>
<?import t.cubed.fxml.*?>
<BorderPane styleClass="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="t.cubed.fxml.FXMLDocumentController">
<top>
<MenuBar fx:id="menuBar" styleClass="menu-bar">
<menus>
<Menu text="File">
<items>
<MenuItem onAction="#handleOpenAction" text="Open" />
<MenuItem onAction="#handleExitAction" text="Exit" />
</items>
</Menu>
<Menu text="Edit">
<items>
<MenuItem onAction="#handleWeightAction" text="Edit Weights" />
<MenuItem onAction="#handleFilterAction" text="Edit Filters" />
<MenuItem onAction="#handleOptionsAction" text="Options" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<GridPane> …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种方法来做到这一点,但我只找到了这个没有答案的问题.
我正在使用1366x768笔记本电脑开发,我使用JavaFX来创建GUI(很抱歉,但是我无法发布代码,它基本上是一个包含几个GridPanes的AnchorPane,其中包含更多GridPanes,其中包含标签,TextField和a情侣图表).
当我在另一个分辨率(1920x1080或1600x900)上加载项目时出现问题.
我正在使用stage.setMaximized(true);,但这只是缩放背景,舞台本身,因此所有元素和容器(面板,标签,TextFields .....)保持与1366x768分辨率相同的大小,使GUI"不适合"分辨率不完全是1366x768.
我希望我能很好地解释我的问题,我的英语远非完美.
有没有人对如何使元素按阶段分辨率进行缩放有任何建议?
(我需要在每台显示器中最大化或全屏显示软件,因此制作固定分辨率(例如1366x768)似乎不是一个好的解决方案).
谢谢你们.
更新:
我刚刚创建了一个小例子.它是默认JavaFX AnchorPane中的2x1 GridPane,我在网格窗格中添加了两个示例按钮.
<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" >
<children>
<GridPane prefHeight="300.0" prefWidth="400.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Button fx:id="example1" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
<Button fx:id="example2" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
</children>
</GridPane>
</children>
Run Code Online (Sandbox Code Playgroud)
这个代码在400x300屏幕上看起来不错(太少了,我知道,这只是一个例子),当我将它缩放到1366x768(不是真正的全屏,只是stage.setMaximized(true);)时,GridPane不能缩放,只有舞台本身,所以我有一个全屏幕背景,屏幕左上角有一个400x300的窗格(带有小按钮).
TL; DR:按钮保留在屏幕左上角的示例代码,当我扩大分辨率时,其余部分只是一个空白区域.
更新2; 忘了Java代码.
Parent root = FXMLLoader.load(getClass().getResource("UI.fxml")); …Run Code Online (Sandbox Code Playgroud) 我一直在使用SceneBuilder,我观察它应用了属性,mnemonicParsing并将其等同于我制作的false每一个Node.
究竟是什么?它有什么区别Layout.xml?
我希望得到一些关于在tabpane中为每个选项卡提供fx:include语句的答案.我已经轻松地管理内容以显示但是相关控制器类的引用方法只是给我一个nullpointerreference异常,无论我如何构造它.包含的FXML布局的控制器既没有构造函数也没有初始化()方法,是否需要它们?我尝试了一些不同的东西,但总是得到同样的例外.
我只是在tabpane中添加一个更改侦听器,当按下一个选项卡时,我想填充一些带有从全局可访问的arraylist获取的值的文本字段.注意:arraylist不是问题,使用主控制器执行此操作工作正常.
我将很快添加一个代码示例,但现在不能.如果您需要更多信息,请告诉我,否则我会在今天晚些时候发布代码.
*编辑,这是我的代码示例,取自StackOverflow上的另一个线程. JavaFX TabPane - 每个选项卡一个控制器
TestApp.java:
public class TestApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Scene scene = new Scene(new StackPane());
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/MainTestWindow.fxml"));
scene.setRoot(loader.load());
MainTestController controller = loader.getController();
controller.init();
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
主控制器,我想引用子控制器.
public class MainTestController {
@FXML private TabPane tabPane;
// Inject tab content.
@FXML private Tab fooTabPage;
// Inject controller
@FXML private FooTabController fooTabPageController;
// Inject tab content. …Run Code Online (Sandbox Code Playgroud) Oracle文档对此并不十分清楚,google和bing都没有.
我可以(像在WPF中)绑定到FXML中的模型,跳过Java中的绑定代码吗?
我确实在某个博客上看到了一个简短的flash,就像$ {object.field}这样的语法,但我无法确定.
后期编辑:我已经做了XAML开发(WPF,Silverlight,Windows Phone)已经有好几年了,我已经习惯于在标记中表达数据绑定.此外,我读过的关于FXExperience 2011年的文章说
我可以稍微改变一下,然后将绑定移动到FXML文档中.这将允许工具除了布局之外还处理数据绑定.请注意,以下代码今天不起作用,因为FXML不支持双向绑定,但我们正在努力修复它.
实际上它就像:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import fxmlapp.Model ?>
<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="fxmlapp.Sample">
<fx:define>
<Model fx:id="model" />
</fx:define>
<children>
<TextField fx:id="firstNameField" text="${model.person.firstName}" />
<Label fx:id="messageLabel" text="${model.person.firstName}" />
</children>
</VBox>
Run Code Online (Sandbox Code Playgroud)
由于它是在2011年的文章中,事情本来可以实施,但没有找到任何证据朝这个方向.因此,经过仔细搜索,我决定在这里问一下.
我想将css文件链接到我的应用程序.在我的fxml文件中,我使用:
<stylesheets>
<URL value="@../stylesheet1.css" />
</stylesheets>
Run Code Online (Sandbox Code Playgroud)
...当我在scenebuilder中打开fxml文件时,我可以看到样式预览.但是当我尝试运行应用程序时,我收到一个错误:
java.net.MalformedURLException:无协议:../ styleles1.css
所以我用这种方式测试了它:
<stylesheets>
<String fx:value="stylesheet1.css" />
</stylesheets>
Run Code Online (Sandbox Code Playgroud)
现在它是另一回事 - 应用程序启动并应用css,但我没有在scenebuilder中看到预览.错误消息:
"文件stylesheet1.css不存在.找不到资源stylesheet1.css."
那么如何正确附加css文件呢?
好吧,虽然我的问题没有得到解答,为什么它不能以上述方式工作,但我找到了一个适合我的解决方案.在我的FXML中我只有这一行
<?scenebuilder-stylesheet ../stylesheet1.css?>
Run Code Online (Sandbox Code Playgroud)
所以Scenebuilder与那个css一起工作.在我的主类中,我以编程方式设置样式表:
Scene scene = new Scene(root);
String css = this.getClass().getResource("../stylesheet1.css").toExternalForm();
scene.getStylesheets().add(css);
Run Code Online (Sandbox Code Playgroud) fxml ×10
javafx ×9
java ×5
javafx-2 ×3
data-binding ×2
borderpane ×1
combobox ×1
css ×1
fxmlloader ×1
gridpane ×1
java-8 ×1
markup ×1
scenebuilder ×1
stylesheet ×1
tableview ×1