目前我有3个活动标签的TabPane。我必须手动在它们之间切换,这并不理想。我想做的是一起替换TabPane,并在舞台上有一个场景,然后按下按钮后切换到下一个场景(从Tab1到Tab2,再到Tab3)。
维护设置标签文本功能很重要。
表1
选项卡2
主.java
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("../view/Main.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
主控制器.java
package controller;
import javafx.fxml.FXML;
import controller.tab.Tab1Controller;
import controller.tab.Tab2Controller;
import controller.tab.Tab3Controller;
public class MainController {
@FXML Tab1Controller tab1Controller;
@FXML Tab2Controller tab2Controller;
@FXML Tab3Controller tab3Controller;
public void initialize() {
tab1Controller.init(this);
tab2Controller.init(this);
tab3Controller.init(this);
}
public void setTab2LabelText(String text) {
tab3Controller.lbl3.setText(text);
tab2Controller.lbl2.setText(text);
}
}
选项卡1控制器.java
package controller.tab;
import controller.MainController;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import java.io.IOException;
public class Tab1Controller {
private MainController main;
@FXML public Label lbl1;
@FXML private Button btn1Send;
@FXML private void btn1SendClicked(ActionEvent event) throws IOException {
main.setTab2LabelText("abc");
}
public void init(MainController mainController) {
main = mainController;
}
}
Tab2Controller.java
package controller.tab;
import controller.MainController;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class Tab2Controller {
private MainController main;
@FXML public Label lbl2;
public void init(MainController mainController) {
main = mainController;
}
}
选项卡3Controller.java
package controller.tab;
import controller.MainController;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class Tab3Controller {
private MainController main;
@FXML public Label lbl3;
public void init(MainController mainController) {
main = mainController;
}
}
Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="432.0" prefWidth="443.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.MainController">
<children>
<TabPane prefHeight="299.0" prefWidth="309.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab closable="false" text="Tab 1">
<content>
<fx:include fx:id="tab1" source="tab/Tab1.fxml" />
</content></Tab>
<Tab closable="false" text="Tab 2">
<content>
<fx:include fx:id="tab2" source="tab/Tab2.fxml" />
</content></Tab>
<Tab closable="false" text="Tab 3">
<content>
<fx:include fx:id="tab3" source="tab/Tab3.fxml" />
</content></Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
Tab2.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="206.0" prefWidth="226.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.tab.Tab1Controller">
<children>
<Button fx:id="btn1Send" layoutX="42.0" layoutY="74.0" mnemonicParsing="false" onAction="#btn1SendClicked" prefHeight="58.0" prefWidth="142.0" text="Send to Tab2 & Tab3" />
</children>
</AnchorPane>
Tab2.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="206.0" prefWidth="226.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.tab.Tab2Controller">
<children>
<Label fx:id="lbl2" alignment="CENTER" layoutX="37.0" layoutY="46.0" prefHeight="17.0" prefWidth="152.0" text="Default Tab2 text" />
</children>
</AnchorPane>
Tab3.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="206.0" prefWidth="226.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.tab.Tab3Controller">
<children>
<Label fx:id="lbl3" alignment="CENTER" layoutX="37.0" layoutY="46.0" prefHeight="17.0" prefWidth="152.0" text="Default Tab3 text" />
</children>
</AnchorPane>
不需要将在fxml文件中创建的所有内容添加到场景中。
例子:
<StackPane fx:id="container" prefHeight="432.0" prefWidth="443.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.MainController">
<children>
<fx:include fx:id="tab1" source="tab/Tab1.fxml" />
<fx:define>
<fx:include fx:id="tab2" source="tab/Tab2.fxml" />
<fx:include fx:id="tab3" source="tab/Tab3.fxml" />
</fx:define>
</children>
</StackPane>
public class MainController {
@FXML private Tab1Controller tab1Controller;
@FXML private Tab2Controller tab2Controller;
@FXML private Tab3Controller tab3Controller;
@FXML private Node tab1;
@FXML private Node tab2;
@FXML private Node tab3;
@FXML private StackPane container;
public void initialize() {
tab1Controller.init(this);
tab2Controller.init(this);
tab3Controller.init(this);
}
public void setTab2LabelText(String text) {
tab3Controller.lbl3.setText(text);
tab2Controller.lbl2.setText(text);
}
public void toTab2() {
container.getChildren().setAll(tab2);
}
}
这里有一个例子
创建 3 个窗格,具有自己的按钮和标签
<?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="380.0" prefWidth="387.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ask.FXMLDocumentController">
<children>
<Pane fx:id="p3" prefHeight="380.0" prefWidth="387.0" visible="false">
<children>
<Label layoutX="184.0" layoutY="181.0" text="p3" />
<Button fx:id="p3previous" layoutX="152.0" layoutY="225.0" mnemonicParsing="false" text="previous" />
</children>
</Pane>
<Pane fx:id="p2" prefHeight="380.0" prefWidth="387.0" visible="false">
<children>
<Label layoutX="184.0" layoutY="181.0" text="p2" />
<Button fx:id="p2previous" layoutX="78.0" layoutY="255.0" mnemonicParsing="false" text="previous" />
<Button fx:id="p2next" layoutX="239.0" layoutY="255.0" mnemonicParsing="false" text="next" />
</children>
</Pane>
<Pane fx:id="p1" prefHeight="380.0" prefWidth="387.0">
<children>
<Button fx:id="p1next" layoutX="167.0" layoutY="210.0" mnemonicParsing="false" text="next" />
<Label layoutX="184.0" layoutY="181.0" text="p1" />
</children>
</Pane>
</children>
</AnchorPane>
添加按钮操作事件,使用 setVisible(布尔值)
控制应显示哪个窗格。
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
public class FXMLDocumentController implements Initializable {
@FXML Pane p1;
@FXML Pane p2;
@FXML Pane p3;
@FXML Button p1next;
@FXML Button p2next;
@FXML Button p2previous;
@FXML Button p3previous;
public void initialize(URL url, ResourceBundle rb)
{
p1next.setOnAction(e->{ p1.setVisible(false); p2.setVisible(true); });
p2next.setOnAction(e->{ p2.setVisible(false); p3.setVisible(true); });
p2previous.setOnAction(e->{ p2.setVisible(false); p1.setVisible(true); });
p3previous.setOnAction(e->{ p3.setVisible(false); p2.setVisible(true); });
}
}
我正在尝试将FXML加载到FXML中。主FXML有一个borderpane,第二个包含一个VBox。我用FXMLLoader加载这两个。当我尝试设置boarderpane的中心时,整个屏幕将被第二个FXML所取代。这是代码 有什么想法会导致这种情况吗?我还尝试制作一个新标签,并将其放在borderpane中心,结果相同。
当演员在另一个班级时,我很难让MoveToAction在演员身上工作(menuBackground)。我在下面附上了相关代码——这根本不会让演员动起来。 我成功地将其他操作应用于MainMenuScreen类中的根阶段,以及MainMenuScreen类中的其他参与者(按钮),但没有成功地将操作应用于单独类中的参与者。 我尝试过将MoveToAction放在Menubackground类中的act
当我运行该程序时,它加载第一个和第二个fxml,但继续显示第一个fxml(当它应该显示第二个时)。我可以使用相同代码的输入(即按钮)从第一个屏幕到第二个屏幕。 我尝试使用不同的加载器,每次设置场景时都使用。show()方法,但这些(或它们的许多变体)都不起作用。 我在调用方法时进行打印--这就是我确定它们被加载的方式(printline): null 相反,输出(在调试中,如果stage.show
开始一个新游戏,改变关卡,或结束游戏时,为了给用户不同的效果呈现,大多需要切换不同的场景。Cocos2d-x 提供了一系列方式去做这件事情 场景切换。 场景切换的方式 有很多场景切换的方式,每种都有特定的方法,让我们来看看: auto myScene = Scene::create(); runWithScene() 用于开始游戏,加载第一个场景。只用于第一个场景! Director::getI
我创建了一个游戏,我想给它添加一个开始屏幕,我使用FXML添加了它,还添加了两个按钮(开始和退出)。 按下开始按钮后,我希望游戏加载场景并切换到游戏开始。我对如何做有一个粗略的想法,但我有点挣扎,因为我的SampleController类不知道如何启动游戏等,因为所有代码(以及加载初始开始菜单的代码)都在我的主类中,所以我尝试了这样的事情: 我尝试使用一个函数来切换场景,但它不起作用,也试图使用获
问题内容: 所以我似乎无法弄清楚…我有一句话要说,我希望它成为。我已经尝试了以下所有方法,但似乎都没有效果; 我真的不明白为什么最后一个有效,因为这样可以正常工作: 我在这里想念什么吗? 编辑 我知道\是转义字符。我要在这里执行的操作是将所有内容都 转换为其他内容, 并且替换似乎没有按照我的预期进行。 我希望字符串a看起来像字符串b。但是替换并不能像我想的那样替换斜线。 问题答案: 无需为此使用r
问题内容: 我正在用Python解析文件中的文本。我必须替换所有换行符(\ n), 因为此文本将生成html-content。例如,这是文件中的一些行: 现在我做: 而且我仍然看到带有换行符的文本。 问题答案: 只是踢,你也可以 用替换字符串中的所有换行符。
我在这里阅读了几个与我的问题相关的问题/解决方案。但似乎什么都不管用。 所以我有一个全屏模式的primarystage,比如说,如果我点击一个按钮,它会改变场景。但舞台似乎显示了任务栏。我还通过将此添加到所有场景方法中解决了此问题。。 但是,场景中的过渡不是那么流畅。首先,它进入桌面,然后回到全屏...这不是理想的解决方案。 以下是我的初级阶段代码: 这是我改变场景的代码: 我不知道这是虫子还是什