如何从控制器类打开JavaFXFileChooser?
我的问题是,所有使用如何从控制器类打开JavaFXFileChooser?,java,javafx,filechooser,Java,Javafx,Filechooser,我的问题是,所有使用FileChooser的示例都要求您通过一个阶段。唯一的问题是我的UI是在一个fxml文件中定义的,该文件使用一个与主阶段分离的控制器类 @FXML protected void locateFile(ActionEvent event) { FileChooser chooser = new FileChooser(); chooser.setTitle("Open File"); chooser.showOpenDialog(???); } 我应
FileChooser
的示例都要求您通过一个阶段。唯一的问题是我的UI是在一个fxml
文件中定义的,该文件使用一个与主阶段分离的控制器类
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
chooser.showOpenDialog(???);
}
我应该在
?
中添加什么才能使其正常工作?就像我说的,我没有对控制器类中任何阶段的任何引用,那么我该怎么办呢?对于场景中的任何节点(例如,根节点;但是您注入的任何节点都可以@FXML
),我该怎么办
您不必坚持应用程序中创建的阶段,您可以:
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
File file = chooser.showOpenDialog(new Stage());
}
或者,如果您想继续使用同一阶段,则必须在以下操作之前将该阶段传递给控制器:
FXMLLoader loader = new FXMLLoader(getClass().getResource("yourFXMLDocument.fxml"));
Parent root = (Parent)loader.load();
MyController myController = loader.getController();
myController.setStage(stage);
您可以在那里使用应用程序的主阶段。从菜单项
public class SerialDecoderController implements Initializable {
@FXML
private MenuItem fileOpen;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
public void fileOpen (ActionEvent event) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
fileChooser.showOpenDialog(fileOpen.getParentPopup().getScene().getWindow());
}
或者,对我有效的方法是:简单地说
null
@FXML
private void onClick(ActionEvent event) {
File file = fileChooser.showOpenDialog(null);
if (file != null) {
//TODO
}
}
我从哪里得到根节点?我必须定义一个
fx:id
,还是我完全没有这个想法?是的,定义一个fx:id
。但您不必使用根节点,只需使用任何已具有fx:id
并已注入控制器的对象(所有节点都在同一场景中…)。您还可以执行Node Node=(Node)event.getSource()但是我不太喜欢这个,因为我的心情不好。你能详细解释一下这个答案吗?首先,在这个上下文中,什么是“节点”,如何“定义一个fx:id”,以及在哪里?我从上面复制了这行代码,但是“节点”部分仍然无法解析。“fx:id”是类中JavaUI对象的名称。通过连接关联的fxml组件(当然也可以直接在fxml代码中):当打开fxml文件并选择所需的小部件时,只需在右手风琴菜单“code”和出现的字段“fx:id”下设置id(对象名称).我认为最好将对话的所有者设置为正确的阶段,而不是虚构的阶段。请参阅“如果设置了文件对话框的所有者窗口,则在显示文件对话框时,将阻止对话框所有者链中所有窗口的输入。”。如果未指定正确的阶段,则不会启用FileChooser的模式对话框阻止功能。通常,在文件选择器中使用模式块是可取的。但是,保持使用相同的阶段是更好的做法,这就是为什么我在回答中显示了一种方法。但需要注意的是,最佳实践并不是唯一的实践。
@FXML
private void onClick(ActionEvent event) {
File file = fileChooser.showOpenDialog(null);
if (file != null) {
//TODO
}
}