Javafx GridPane充当mouseTransparent,但未设置
我想做什么? 我面临一个基于fxml的javafx应用程序的问题。我想创建一个简单的表单来输入一些数值,这些数值应该在确认后存储在文件中 有什么问题吗? 表单完美地完成了它应该做的事情,只是我不能用鼠标单击两个网格窗格中的元素。我可以通过按tab按钮切换文本字段来输入值,但这当然不是理想的方式。我已经在AnchorPane中直接添加了文本字段和复选框,它们是可点击的,但在网格窗格中这不起作用。同一锚泊烷内的FlowPane也工作得非常好 对我来说,网格窗格的作用似乎是将其设置为mouseTransparent=“true”,但事实并非如此,我已经尝试将其显式设置为false。我找不到这种行为的原因,所以也许你们当中有人有想法 编辑:在同一个选项卡中使用了一个附加的GridPane之后,我发现在这个文件中它不是一个通用的GridPane问题。对于只有复选框和一个锚的GridPane,可以访问元素。是否存在重叠,防止通过鼠标访问 在单独类的初始值设定函数中,场景设置为:Javafx GridPane充当mouseTransparent,但未设置,javafx,fxml,gridpane,Javafx,Fxml,Gridpane,我想做什么? 我面临一个基于fxml的javafx应用程序的问题。我想创建一个简单的表单来输入一些数值,这些数值应该在确认后存储在文件中 有什么问题吗? 表单完美地完成了它应该做的事情,只是我不能用鼠标单击两个网格窗格中的元素。我可以通过按tab按钮切换文本字段来输入值,但这当然不是理想的方式。我已经在AnchorPane中直接添加了文本字段和复选框,它们是可点击的,但在网格窗格中这不起作用。同一锚泊烷内的FlowPane也工作得非常好 对我来说,网格窗格的作用似乎是将其设置为mouseTran
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
不如使用像?aVBox
这样的工具来垂直布置节点。您还可以将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>