Javafx GridPane充当mouseTransparent,但未设置

Javafx GridPane充当mouseTransparent,但未设置,javafx,fxml,gridpane,Javafx,Fxml,Gridpane,我想做什么? 我面临一个基于fxml的javafx应用程序的问题。我想创建一个简单的表单来输入一些数值,这些数值应该在确认后存储在文件中 有什么问题吗? 表单完美地完成了它应该做的事情,只是我不能用鼠标单击两个网格窗格中的元素。我可以通过按tab按钮切换文本字段来输入值,但这当然不是理想的方式。我已经在AnchorPane中直接添加了文本字段和复选框,它们是可点击的,但在网格窗格中这不起作用。同一锚泊烷内的FlowPane也工作得非常好 对我来说,网格窗格的作用似乎是将其设置为mouseTran

我想做什么?

我面临一个基于fxml的javafx应用程序的问题。我想创建一个简单的表单来输入一些数值,这些数值应该在确认后存储在文件中

有什么问题吗?

表单完美地完成了它应该做的事情,只是我不能用鼠标单击两个网格窗格中的元素。我可以通过按tab按钮切换文本字段来输入值,但这当然不是理想的方式。我已经在AnchorPane中直接添加了文本字段和复选框,它们是可点击的,但在网格窗格中这不起作用。同一锚泊烷内的FlowPane也工作得非常好

对我来说,网格窗格的作用似乎是将其设置为mouseTransparent=“true”,但事实并非如此,我已经尝试将其显式设置为false。我找不到这种行为的原因,所以也许你们当中有人有想法

编辑:在同一个选项卡中使用了一个附加的GridPane之后,我发现在这个文件中它不是一个通用的GridPane问题。对于只有复选框和一个锚的GridPane,可以访问元素。是否存在重叠,防止通过鼠标访问

在单独类的初始值设定函数中,场景设置为:

        BorderPane root = FXMLLoader.load(getClass().getResource("..\\initializeSeason\\InitializeSeason.fxml"));
        Scene scene = new Scene(root,600,900);
        stage.setScene(scene);
        stage.show();
xfml文件的构建方式如下(对于德语名称,我很抱歉):


虽然我确信这个问题可以在.fxml文件中找到,但我也添加了LeagueRulesController类

            package application;

    import java.net.URL;
    import java.util.ArrayList;
    import java.util.ResourceBundle;

    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.geometry.Pos;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.GridPane;
    import javafx.stage.Stage;

    public class LeagueRulesController implements Initializable{


        private ArrayList<TextField> tdDiffs;
        private ArrayList<TextField> points;



        @FXML
        private CheckBox isConcedeMaxWin;

        @FXML
        private Button okButton;
        @FXML
        private Button abbrechenButton;

        @FXML
        private void handleAbbrechen(ActionEvent actionEvet) {
            Stage stage = (Stage) abbrechenButton.getScene().getWindow();
            // do what you have to do
            stage.close();
        }

        @FXML
        private void handleOK(ActionEvent actionEvet) {

            Stage stage = (Stage) abbrechenButton.getScene().getWindow();
            stage.close();
        }

        @FXML
        private TextField numberOfShortNameChars;
        @FXML
        private TextField numberOfTDDiffEntries;    
        @FXML
        private GridPane tdDiffEntrys;

        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            numberOfShortNameChars.setText("25");
            numberOfShortNameChars.textProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                    numberFieldListener(numberOfShortNameChars, oldValue,newValue);
                }
            });

            numberOfTDDiffEntries.setText("5");

            initializeTDDiffArray();

            numberOfTDDiffEntries.textProperty().addListener(new ChangeListener<String>() {

                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                    numberFieldListener(numberOfTDDiffEntries, oldValue,newValue);
                    initializeTDDiffArray();
                }
            });
        }

        private void initializeTDDiffArray() {
            tdDiffEntrys.getChildren().clear();
            tdDiffs = new ArrayList<>();
            points = new ArrayList<>();

            tdDiffEntrys.add(new Label("TD Diff"), 0, 0);
            tdDiffEntrys.add(new Label("Punkte"), 1, 0);

            int numberOfTDDiffEntriesInt;
            if(numberOfTDDiffEntries.getText().equals(""))
                numberOfTDDiffEntriesInt = 1;
            else
                numberOfTDDiffEntriesInt =Integer.parseInt(numberOfTDDiffEntries.getText());

            for (int i = 0; i < numberOfTDDiffEntriesInt; i++) {
                tdDiffs.add(new TextField());
                points.add(new TextField());
                tdDiffs.get(tdDiffs.size()-1).setText(Integer.toString(i-numberOfTDDiffEntriesInt/2));
                points.get(points.size()-1).setText(Integer.toString(i+1));

                tdDiffs.get(tdDiffs.size()-1).setAlignment(Pos.BASELINE_RIGHT);
                points.get(points.size()-1).setAlignment(Pos.BASELINE_RIGHT);

                tdDiffs.get(tdDiffs.size()-1).setPrefWidth(1);
                points.get(points.size()-1).setPrefWidth(1);

                tdDiffs.get(tdDiffs.size()-1).textProperty().addListener(new ChangeListener<String>() {
                    @Override
                    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                        numberFieldListener(tdDiffs.get(tdDiffs.size()-1), oldValue,newValue);
                    }
                });
                points.get(points.size()-1).textProperty().addListener(new ChangeListener<String>() {
                    @Override
                    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                        numberFieldListener(points.get(points.size()-1), oldValue,newValue);
                    }
                });

                tdDiffEntrys.add(tdDiffs.get(tdDiffs.size()-1), 0, i+1);
                tdDiffEntrys.add(points.get(points.size()-1), 1,  i+1);
            }

        }

        private void numberFieldListener(TextField textField, String oldValue,String newValue) {

            if(!newValue.matches("\\d*")) {
                textField.setText(newValue.replaceAll("[^\\d]", ""));
            }
        }

    }
包应用;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.ResourceBundle;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.geometry.Pos;
导入javafx.scene.control.Button;
导入javafx.scene.control.CheckBox;
导入javafx.scene.control.Label;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.GridPane;
导入javafx.stage.stage;
公共类LeagueRulesController实现可初始化{
私有阵列列表TDDiff;
私有数组列表点;
@FXML
私有复选框为concedemaxwin;
@FXML
私人按钮;
@FXML
专用按钮abbrechenButton;
@FXML
私有无效handleAbbrechen(ActionEvent actionEvet){
Stage Stage=(Stage)abbrechenButton.getScene().getWindow();
//做你必须做的事
stage.close();
}
@FXML
私有无效句柄(ActionEvent actionEvet){
Stage Stage=(Stage)abbrechenButton.getScene().getWindow();
stage.close();
}
@FXML
私有文本字段numberOfShortNameChars;
@FXML
私有文本字段numberoftddifferentries;
@FXML
私有网格窗格TDN入口;
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
numberOfShortNameChars.setText(“25”);
numberOfShortNameChars.textProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue您的
FlowPane
位于
GridPane
之上,该窗格阻止鼠标事件到达
GridPane
。在FXML文件中,您的
GridPane
FlowPane
约束设置为10(用于顶部、左侧、底部和右侧)。这意味着两个节点在
锚泊盘中占用相同的空间。由于您在
流窗格
中添加
第二个,因此
网格窗格
会被覆盖。请注意,添加
网格窗格
第二个最有可能允许您单击
文本字段
s,但会阻止您单击
按钮n
s

与其使用
AnchorPane
不如使用像?a
VBox
这样的工具来垂直布置节点。您还可以将
FlowPane
替换为,因为这似乎是您所追求的行为。您最终会得到如下结果:

<Tab>
    <VBox>
        <GridPane>
            <!-- your GirdPane children -->
        </GridPane>
        <HBox>
            <!-- your buttons -->
        </HBox>
    </VBox>
</Tab>

为了简洁起见,我省略了属性。显然,您应该将它们设置为所需的值

如果你走这条路,你需要将你的
标签移动到新的
HBox
,它的文本设置为
“Erhält Gewinnerteam bei Spielaufgabe maximale Punktzahl:”
,作为第一个孩子。这样它就与按钮保持一致


当然,你不必更换你的
锚烷
。如果你想保留它,你将
<Tab>
    <VBox>
        <GridPane>
            <!-- your GirdPane children -->
        </GridPane>
        <HBox>
            <!-- your buttons -->
        </HBox>
    </VBox>
</Tab>