从另一个视图单击按钮时打开 TabPane
Opening a TabPane when button is clicked from another view
我有两个单独的视图,一个包含一个按钮 view A,另一个包含 3 个选项卡的 TabPane 称为 view B。这两个视图由两个独立的视图控制器 类 控制。我希望能够在 view A 中单击一个按钮,并能够在 view B 的 TabPane 中打开一个特定的选项卡。
到目前为止,我已尝试使用 view B 扩展 view A 的控制器,这样我就可以获得 [=] 中定义的 TabPane 31=]查看 B 的 控制器然后调用 myTabPane.getSelectionModel().select(myTab);
但是这没有用,因为它抛出 NullPointerException。
我的问题是可以单击 视图 A 中的按钮以打开 视图 B 并在 查看 B 的 TabPane。
我也查看了这些链接,但没有运气 1。setting selected tab, 2. switch through tabs programatically, 3. switch between tabs in tabpane
假设上图是 视图 A,当您单击右键时,它应该打开 视图 B 并在 查看 B 的 TabPane。
假设上图是 视图 B,当单击 视图 A 右侧的按钮时,它应该打开 查看 B 并将选项卡设置为选项卡 C.
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.control.SelectionModel;
public class SucessfulCreateProjectViewController extends AdminViewController {
@FXML
private Button OkButton;
@FXML
void handleCreateTasksButtonAction(ActionEvent event) {
try{
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("AdminView.fxml"));
Scene scene = new Scene(fxmlLoader.load());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
AdminTabPane.getSelectionModel().select(1);;
}catch(Exception e){
ErrorHandlerController.infoBox("Error Opening AdminPage", "Fail", null);
e.printStackTrace();
}
}
@FXML
void handleOKButtonAction(ActionEvent event) {
Stage stage = (Stage) OkButton.getScene().getWindow();
stage.close();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
} }
Mediator 是一种设计模式,用于在相互不认识的对象之间进行通信。
这是一个可以完成您工作的调解员示例。
public class Mediator {
private static Mediator instance;
private Consumer<String> consumer;
public static Mediator getInstance() {
if(instance == null) {
instance = new Mediator();
}
return instance;
}
private Mediator() {
}
public void register(Consumer<String> consumer) {
this.consumer = consumer;
}
public void fireEvent(String string) {
if(consumer != null) {
consumer.accept(string);
}
}
}
分别是两个控制器
public class ViewAController {
@FXML
private Button btnL, btnR;
@FXML
private void initialize() {
btnL.setOnAction(event -> Mediator.getInstance().fireEvent("left"));
btnR.setOnAction(event -> Mediator.getInstance().fireEvent("right"));
}
}
public class ViewBController {
@FXML
private TabPane tabPane;
@FXML
private void initialize() {
Mediator.getInstance().register(s -> {
switch (s) {
case "left":
tabPane.getSelectionModel().select(0);
break;
case "right":
tabPane.getSelectionModel().select(2);
break;
}
});
}
}
这是一个测试应用程序,可以同时打开两个 windows。
public class Main extends Application {
@Override
public void start(Stage stageA) throws Exception{
Parent viewA = FXMLLoader.load(getClass().getResource("view_a.fxml"));
Parent viewB = FXMLLoader.load(getClass().getResource("view_b.fxml"));
stageA.setTitle("View A");
stageA.setScene(new Scene(viewA));
stageA.show();
Stage stageB = new Stage();
stageB.setTitle("View B");
stageB.setScene(new Scene(viewB));
stageB.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果你不想同时使用两个windows,只需更换中间人即可。
我有两个单独的视图,一个包含一个按钮 view A,另一个包含 3 个选项卡的 TabPane 称为 view B。这两个视图由两个独立的视图控制器 类 控制。我希望能够在 view A 中单击一个按钮,并能够在 view B 的 TabPane 中打开一个特定的选项卡。
到目前为止,我已尝试使用 view B 扩展 view A 的控制器,这样我就可以获得 [=] 中定义的 TabPane 31=]查看 B 的 控制器然后调用 myTabPane.getSelectionModel().select(myTab);
但是这没有用,因为它抛出 NullPointerException。
我的问题是可以单击 视图 A 中的按钮以打开 视图 B 并在 查看 B 的 TabPane。
我也查看了这些链接,但没有运气 1。setting selected tab, 2. switch through tabs programatically, 3. switch between tabs in tabpane
假设上图是 视图 A,当您单击右键时,它应该打开 视图 B 并在 查看 B 的 TabPane。
假设上图是 视图 B,当单击 视图 A 右侧的按钮时,它应该打开 查看 B 并将选项卡设置为选项卡 C.
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.control.SelectionModel;
public class SucessfulCreateProjectViewController extends AdminViewController {
@FXML
private Button OkButton;
@FXML
void handleCreateTasksButtonAction(ActionEvent event) {
try{
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("AdminView.fxml"));
Scene scene = new Scene(fxmlLoader.load());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
AdminTabPane.getSelectionModel().select(1);;
}catch(Exception e){
ErrorHandlerController.infoBox("Error Opening AdminPage", "Fail", null);
e.printStackTrace();
}
}
@FXML
void handleOKButtonAction(ActionEvent event) {
Stage stage = (Stage) OkButton.getScene().getWindow();
stage.close();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
} }
Mediator 是一种设计模式,用于在相互不认识的对象之间进行通信。
这是一个可以完成您工作的调解员示例。
public class Mediator {
private static Mediator instance;
private Consumer<String> consumer;
public static Mediator getInstance() {
if(instance == null) {
instance = new Mediator();
}
return instance;
}
private Mediator() {
}
public void register(Consumer<String> consumer) {
this.consumer = consumer;
}
public void fireEvent(String string) {
if(consumer != null) {
consumer.accept(string);
}
}
}
分别是两个控制器
public class ViewAController {
@FXML
private Button btnL, btnR;
@FXML
private void initialize() {
btnL.setOnAction(event -> Mediator.getInstance().fireEvent("left"));
btnR.setOnAction(event -> Mediator.getInstance().fireEvent("right"));
}
}
public class ViewBController {
@FXML
private TabPane tabPane;
@FXML
private void initialize() {
Mediator.getInstance().register(s -> {
switch (s) {
case "left":
tabPane.getSelectionModel().select(0);
break;
case "right":
tabPane.getSelectionModel().select(2);
break;
}
});
}
}
这是一个测试应用程序,可以同时打开两个 windows。
public class Main extends Application {
@Override
public void start(Stage stageA) throws Exception{
Parent viewA = FXMLLoader.load(getClass().getResource("view_a.fxml"));
Parent viewB = FXMLLoader.load(getClass().getResource("view_b.fxml"));
stageA.setTitle("View A");
stageA.setScene(new Scene(viewA));
stageA.show();
Stage stageB = new Stage();
stageB.setTitle("View B");
stageB.setScene(new Scene(viewB));
stageB.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果你不想同时使用两个windows,只需更换中间人即可。