当前位置: 首页 > 知识库问答 >
问题:

如何使按钮在另一个类JAVAFX中工作

谭健柏
2023-03-14
import java.io.IOException;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.fxml.FXMLLoader;
import javafx.stage.Modality;
import javafx.stage.Stage;
import vp.dict.model.Data;
import vp.dict.view.ContentController;
import vp.dict.view.EditDialogController;
import vp.dict.view.RootController;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;


public class MainApp extends Application {

    private Stage window;
    private BorderPane rootLayout;

    private ObservableList<Data> dataList = FXCollections.observableArrayList();

    public MainApp(){
        dataList.add(new Data("Hi", "Haj", "Ahoj, cau"));
        dataList.add(new Data("Hello", "Helou", "Ahoj"));
        dataList.add(new Data("New", "Nju", "Novy"));
    }

    public ObservableList<Data> getDataList(){
        return dataList;
    }

    public void start(Stage window) throws IOException {
        this.window = window;
        this.window.setTitle("EN/CZ Dictionary 2017");

        initRootLayout();
        initContent();
    }

    public void initRootLayout() throws IOException{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("../view/rootLayout.fxml"));
        rootLayout = (BorderPane)loader.load();

        Scene scene = new Scene(rootLayout);
        window.setScene(scene);
        RootController controller = loader.getController();
        controller.setMainApp(this);

        window.show();
    }

    public void initContent() throws IOException{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("../view/contentLayout.fxml"));
        AnchorPane ap = (AnchorPane)loader.load();

        rootLayout.setCenter(ap);
        ContentController controller = loader.getController();
        controller.setMainApp(this);

    }

    public boolean showEditWindow(Data data) throws IOException{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("../view/editDialogLayout.fxml"));
        AnchorPane ap = (AnchorPane)loader.load();

        Stage editWindow = new Stage();
        editWindow.setTitle("Add a New Word");
        editWindow.initModality(Modality.WINDOW_MODAL);
        editWindow.initOwner(window);

        Scene scene = new Scene(ap);
        editWindow.setScene(scene);

        EditDialogController controller = loader.getController();
        controller.setStage(editWindow);
        controller.setData(data);

         editWindow.showAndWait();

         return controller.isOkClicked();
    }

    public Stage getWindow(){
        return window;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
package vp.dict.view;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import vp.dict.main.MainApp;
import vp.dict.model.Data;

public class ContentController {

    @FXML
    private TableView<Data> dataTable;

    @FXML
    private TableColumn<Data, String> englishColumn;

    @FXML
    private TableColumn<Data, String> pronunciationColumn;

    @FXML
    private TableColumn<Data, String> meaningColumn;

    private MainApp mainApp;

    public ContentController(){

    }

    @FXML
    public void initialize(){
        englishColumn.setCellValueFactory(CellData -> CellData.getValue().englishProperty());
        pronunciationColumn.setCellValueFactory(CellData -> CellData.getValue().pronunciationProperty());
        meaningColumn.setCellValueFactory(CellData -> CellData.getValue().meaningProperty());
    }

    public void setMainApp(MainApp mainApp){
        this.mainApp = mainApp;

        dataTable.setItems(mainApp.getDataList());
    }

    public TableView<Data> geTableView(){
        return dataTable;
    }
}

RootController类是我需要进行工作的地方。在方法private void handleDelete()中,您可以在注释中看到一些代码,这是一个工作代码,但我无法找到从ContentController类加载数据的方法,这是上面的代码垃圾。

package vp.dict.view;

import java.io.IOException;

import javax.security.auth.login.Configuration;

import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TableView;
import vp.dict.main.MainApp;
import vp.dict.model.Data;

public class RootController {

    private MainApp mainApp;

    public void initialize(){

    }

    public RootController(){

    }

    public void setMainApp(MainApp mainApp){
        this.mainApp = mainApp;
    }

    @FXML
    private void addClicked() throws IOException{
        Data tempData = new Data();
        boolean okClicked = mainApp.showEditWindow(tempData);
        if(okClicked){
            mainApp.getDataList().add(tempData);
        }
    }

    @FXML
    private void handleDelete() throws IOException{



      /*  int selectedIndex = contentTable.geTableView().getSelectionModel().getSelectedIndex();
        if (selectedIndex >= 0) {
            contentTable.geTableView().getItems().remove(selectedIndex);
        } else {
            // Nothing selected.
            Alert alert = new Alert(AlertType.WARNING);
            alert.initOwner(mainApp.getWindow());
            alert.setTitle("No Selection");
            alert.setHeaderText("No Person Selected");
            alert.setContentText("Please select a person in the table.");

            alert.showAndWait();
        }*/
    }       
}

我将感谢任何关于如何使它工作的想法。

共有1个答案

羊越
2023-03-14

首先,您无法从rootcontroller访问contentcontroller,因为这两者之间没有任何引用。其次,让contentcontroller来处理它可能更简单,而rootcontroller只做通知。

好吧,我把执行命令弄乱了一点。这才是正确的。

MainApp:

private void RootController rootController;

...

// In initRoot()
this.rootController = loader.getController();

// Replace the below line in initContent():
//ContentController controller = loader.getController();
//controller.setMainApp(this);
ContentController controller = loader.getController();
controller.setMainApp(this);
this.rootController.setContentController(controller);
private ContentController contentController;
public void setContentController(ContentController content)
{
    this.contentController = content;
}

...

@FXML
private void handleDelete() throws IOException
{
    if (this.contentController != null)
        this.contentController.handleDelete();
}
public void handleDelete()
{
    // Whatever delete logic you originally had here
}
 类似资料:
  • 问题内容: 我有一JFrame堂课,它是在Netbeans的设计部分制作的。我正在尝试创建一个登录按钮,该按钮将关闭当前框架并打开另一个框架,无论如何我可以这样做吗? 我努力了: 但我希望它在设计部分中可编辑! 问题答案: 双击NETBEANS中的“登录”按钮,或在Click事件上添加事件监听器(ActionListener)

  • 我希望有几个JavaFX按钮,用文本更新应用程序中的一个标签。出于测试目的,它只是按钮文本。 我一开始做的很好,看起来是这样的: 然后,我决定用CSS对我的按钮进行样式化,因为我想用不同的方式对几组按钮进行样式化,所以我以这种方式对JavaFX Button类进行了子类化: 这仍然有效。但是现在我希望我的事件处理程序被移动到Button子类(以避免将完全相同的代码复制粘贴到我的每个按钮中)。我做的

  • 我有我的UIController类和一个按钮方法类。按钮方法类包含按钮操作的所有代码。我需要能够使用按钮方法类中控制器类中的按钮。例如,我在控制器类中定义了这些 例如,单击按钮时,按钮锁定有一个动作事件 理想情况下,我希望按钮方法可以做到这一点: 出于各种原因,我不能将代码放在动作事件中,而将按钮对象放在参数中会让我的操作变得太混乱。那么如何将FXML对象放入button类中呢?

  • 我有两个类和一个文本文件数据库,第一个类中的,我们将其称为自动设置为数据库中的数字。现在,在中,我有一个小的和一个文本字段,当然还有一个按钮,我在文本字段中的值会覆盖数据库中的值,但问题出在这里。第一个类中的标签在运行时不会更新,但如果我重新启动它,它会显示我想要的值。 如何在程序运行时更新它?我尝试在另一个类的中更改标签,但它每次都给我一个。 我怎么解决这个? 我希望这让我更容易理解我的问题。这

  • 在我的项目中,我有3个文件: FXMLController.java这是一个JavaFX文件 FXML。这是另一个JavaFX文件 JavaApplication3.java这个文件只包含我的主要方法: 我想从我的主方法启动我的FXMLController类来运行这个程序。怎么做呢?我写的代码不工作可能是因为我有这个错误“没有找到合适的方法启动”。

  • 本文向大家介绍javafx 创建一个按钮,包括了javafx 创建一个按钮的使用技巧和注意事项,需要的朋友参考一下 示例 创建aButton很简单: 这将创建一个新的Button,内部没有任何文本或图形。 如果要Button使用文本创建一个,只需使用带有Stringas参数的构造函数(用于设置textProperty的Button): 如果您想创建一个Button内部带有图形或其他图形的Node,