如何在 Java FX 中动态加载 ImageView 中的图像
How to load image in ImageView dynamically in Java FX
我正在使用 FXML 并在一个舞台上有两个不同的场景。 btnStart 在 scene1 上,imgBtn 在 scene2 上。当我单击 btnStart 时,它将 scene2 设置为 stage 并将图像加载到 imageView(这会抛出 NullPointerException)。但是当我在 scene2 上单击 imgBtn 时,它正在加载图像。
我的问题是切换到scene2时如何动态加载图片?
@FXML private Button imgBtn;
@FXML private Button btnStart;
@FXML public ImageView imageView;
@FXML
public void imgBtnClicked()throws Exception{
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
@FXML
public void btnStartClicked()throws Exception{
SetScene2();
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
public void SetScene2()throws Exception {
Parent root = FXMLLoader.load(getClass().getResource(fxmlFile2.fxml));
String css=getClass().getResource("myStyle.css").toExternalForm();
Scene scene;
try{
scene=new Scene(root,root.getScene().getWidth(),root.getScene().getHeight());
}
catch(NullPointerException e) {
scene=new Scene(root,stage.getWidth(),stage.getHeight());
}
scene.getStylesheets().add(css);
stage.setScene(scene);
}
问题不是很清楚,所以我在这里做一些猜测。最可能的问题是您混淆了哪个 Node
在哪个场景哪个控制器上。
正确的结构是您有两套以下各项:
- FXML 文件
- 控制器class
Scene
对象。
应该这样做:
public class ControllerA {
@FXML private Button btnStart;
@FXML
public void btnStartClicked()throws Exception{
setScene2();
}
public void setScene2()throws Exception {
// You may need to set the controller to an instance of ControllerB,
// depending whether you have done so on the FXML.
Parent root = FXMLLoader.load(getClass().getResource(fxmlFile2.fxml));
String css=getClass().getResource("myStyle.css").toExternalForm();
Scene scene;
try{
scene=new Scene(root,root.getScene().getWidth(),root.getScene().getHeight());
}
catch(NullPointerException e) {
scene=new Scene(root,stage.getWidth(),stage.getHeight());
}
scene.getStylesheets().add(css);
stage.setScene(scene);
}
}
public class ControllerB {
@FXML private ImageView imageView;
@FXML private Button imgBtn;
@FXML public void initialize() {
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
@FXML
public void imgBtnClicked()throws Exception{
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
}
我正在使用 FXML 并在一个舞台上有两个不同的场景。 btnStart 在 scene1 上,imgBtn 在 scene2 上。当我单击 btnStart 时,它将 scene2 设置为 stage 并将图像加载到 imageView(这会抛出 NullPointerException)。但是当我在 scene2 上单击 imgBtn 时,它正在加载图像。
我的问题是切换到scene2时如何动态加载图片?
@FXML private Button imgBtn;
@FXML private Button btnStart;
@FXML public ImageView imageView;
@FXML
public void imgBtnClicked()throws Exception{
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
@FXML
public void btnStartClicked()throws Exception{
SetScene2();
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
public void SetScene2()throws Exception {
Parent root = FXMLLoader.load(getClass().getResource(fxmlFile2.fxml));
String css=getClass().getResource("myStyle.css").toExternalForm();
Scene scene;
try{
scene=new Scene(root,root.getScene().getWidth(),root.getScene().getHeight());
}
catch(NullPointerException e) {
scene=new Scene(root,stage.getWidth(),stage.getHeight());
}
scene.getStylesheets().add(css);
stage.setScene(scene);
}
问题不是很清楚,所以我在这里做一些猜测。最可能的问题是您混淆了哪个 Node
在哪个场景哪个控制器上。
正确的结构是您有两套以下各项:
- FXML 文件
- 控制器class
Scene
对象。
应该这样做:
public class ControllerA {
@FXML private Button btnStart;
@FXML
public void btnStartClicked()throws Exception{
setScene2();
}
public void setScene2()throws Exception {
// You may need to set the controller to an instance of ControllerB,
// depending whether you have done so on the FXML.
Parent root = FXMLLoader.load(getClass().getResource(fxmlFile2.fxml));
String css=getClass().getResource("myStyle.css").toExternalForm();
Scene scene;
try{
scene=new Scene(root,root.getScene().getWidth(),root.getScene().getHeight());
}
catch(NullPointerException e) {
scene=new Scene(root,stage.getWidth(),stage.getHeight());
}
scene.getStylesheets().add(css);
stage.setScene(scene);
}
}
public class ControllerB {
@FXML private ImageView imageView;
@FXML private Button imgBtn;
@FXML public void initialize() {
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
@FXML
public void imgBtnClicked()throws Exception{
imageView.setImage(new Image(new FileInputStream("src/Assets/CardAssets/png-v2/3C.png")));
}
}