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

JavaFX imageview setImage返回null并且不工作

轩辕煜
2023-03-14

我正在尝试使用数据库的第一个图像设置ImageViewimg_1。由于某种原因,它不起作用,我不知道为什么。方法loadImage在不同的类中调用。

public class MainMenuController implements Initializable 
{
    /**
     * Initializes the controller class.
    */
    @Override
       public void initialize(URL url, ResourceBundle rb) {
       // TODO
    }

    //DBConnect dbimg = new DBConnect();
    @FXML
    private void openSecondWindow(ActionEvent event) {
    try {
        GUIController ctrl = new GUIController();
        ctrl.loadImg();
        //ctrl.firstScreen();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

我还试着用一个单独的方法设置图像,但我需要在创建整个舞台场景等的同时调用它,即使从第二个方法那样调用它,它也不起作用。

这是持有setImage的类

@FXML
private ImageView img_1;

@FXML
private AnchorPane stck1;

ResultSet rs = null;
Statement stmnt = null;
Connection con = null;

String host = "jdbc:derby://localhost:1527/InteractiveGameDatabase;allowMultiQueries=true";
String unm = "Kylar";
String pswrd = "aswzxc";

BufferedImage imgt = null;
InputStream fis = null;
int xcoord;
int ycoord;
int newcoord;

String SQL = "SELECT*FROM location";


public ImageView loadImg() throws IOException {

    try {

        Stage stage = new Stage();
           AnchorPane stck1 = ((AnchorPane) FXMLLoader.load(InteractiveFictionGame2.class.getResource("GUI.fxml")));

        stck1.getChildren().addAll();
        Scene scene = new Scene(stck1);
        stage.setTitle("Interactive Fiction Game");
        stage.setScene(scene);
        stage.sizeToScene();
        stage.show();

        String SQL = "SELECT*FROM location";
        con = DriverManager.getConnection(host, unm, pswrd);
        stmnt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
        rs = stmnt.executeQuery(SQL);
        rs.next();
        fis = rs.getBinaryStream(4);
        imgt = javax.imageio.ImageIO.read(fis);
        Image newImg = SwingFXUtils.toFXImage(imgt, null);

调用时,设置图像会给我一个null值,imageview的默认值为null,但实际上我正在加载一个图像,甚至用newImg检查。isError()-返回为“image loaded=true”。点击按钮的下一个方法是再次设置imageView,这是可行的。

        img_1.setImage(newImg)
        rs.close();
        stmnt.close();
        con.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    return img_1;
}

这是第二种有效的方法

public ImageView goNorth()引发IOException{try{

        String SQLNorth = "select vista from location where ycoordinate = ? and xcoordinate = ?";
        System.out.println("coords are" + xcoord + ycoord);
        newcoord = ycoord + 1;
        System.out.println("New coord x and y are" + xcoord + newcoord);

        con = DriverManager.getConnection(host, unm, pswrd);
        stmnt2 = con.prepareStatement(SQLNorth);
        stmnt2.setInt(1, newcoord);
        stmnt2.setInt(2, xcoord);
        rs = stmnt2.executeQuery();
        rs.next();
        fis2 = rs.getBinaryStream(1);
        imgt2 = javax.imageio.ImageIO.read(fis2);
        Image newImg = SwingFXUtils.toFXImage(imgt2, null);
        img_1.setImage(newImg);


    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    return img_1;
}

我真的不明白我该怎么取控制器——全班都是控制器?!正确的方法是什么?我只是在看getClass()方法,我不明白我是在类上调用getClass,还是在整个包上调用getClass,以及在指定我将哪个类设置为控制器的路径中?

@FXML
 private void openSecondWindow(ActionEvent event) {
        try {
            FXMLLoader loader;
            loader = new FXMLLoader(GUIController.class.getClass().getResource("GUI.fxml").toExternalForm());
            Parent parent =loader.load();
            GUIController ctrl = loader.getController();
            ctrl.loadImg();
            //ctrl.firstScreen();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

共有2个答案

濮泳
2023-03-14

我认为如果你的目标是用新场景打开新窗口,这将是更合适的方式。首先,创建新阶段,加载fxml并在MainMenuController中设置场景。这将使事情分开。

@FXML
 private void openSecondWindow(ActionEvent event) {
        try {
            Stage stage = new Stage();
            FXMLLoader loader = new FXMLLoader(getClass().getResource("GUI.fxml"));
            Parent parent = loader.load();
            stage.setTitle("Interactive Fiction Game");      
            stage.setScene(new Scene(parent));
            GUIController ctrl = loader.getController();
            ctrl.loadImg();
            //ctrl.firstScreen();

            stage.show();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

在这段代码中,我看到您在过度重写stck1,而没有必要这样做,stck1已经初始化了。

public ImageView loadImg() throws IOException {

    try {


        String SQL = "SELECT*FROM location";
        con = DriverManager.getConnection(host, unm, pswrd);
        stmnt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
        rs = stmnt.executeQuery(SQL);
        rs.next();
        fis = rs.getBinaryStream(4);
        imgt = javax.imageio.ImageIO.read(fis);
        Image newImg = SwingFXUtils.toFXImage(imgt, null);
丁恩
2023-03-14

问题是GUIController ctrl=new GUIController()

第一种方法的问题是用@FXML注释的字段只有在您加载fxml时才会被实例化。使用new初始化控制器不会这样做。

不要初始化控制器,而是从FXMLLoader中获取它

FMLLoader loader = new FXMLLoader(getClass().getResource("SOME_PATH").toExternalForm());
Parent parent = loader.load();
GUIController ctrl = loader.getController();

我不明白我是在给一个班级打电话吗

你不必。你要么用

getClass().getResource("SOME_PATH")

或者你使用

GUIController.class.getResource("SOME_PATH")

两者都会给你相同的结果。

在指定要设置为控制器的类的路径中

既然你还没有在你的问题中添加任何fxml,我就猜测一下,然后说这是GUI。fxml看起来就像:

<AnchorPane fx:id="vbox" prefHeight="117.0" prefWidth="285.0" xmlns="http://javafx.com/javafx/8" 
        xmlns:fx="http://javafx.com/fxml/1" fx:controller="package.GUIController">
    <children>
        ...
    </children>
</AnchorPane>

控制器是在加载程序中指定的类。getController()将返回GUIController类的实例。

 类似资料:
  • 我正在制作一个程序,每次你点击一个按钮,它会显示你在文本视图中复制了什么文本 但是当我调用(ClipboardManager)getSystemService(CLIPBOARD_SERVICE)时,它返回null; 我已经复制了一些可用的文本(“ABC”),但它不起作用 我不知道剪贴板是否需要任何用户权限?在我的清单中,我没有写任何关于权限的内容 请帮帮我\ 这是我的密码: 这是我的日志:

  • 我使用Apache POI v3.12有以下问题:我需要使用49行[0…48]的XLSX文件作为模板,用数据填充它的单元格并将其写成不同的文件,这样我就可以再次重用模板。我正在做的大约是这样的: /稍后/ 经过调试,getRow()返回null,但是尝试。createRow()失败,原因是: 我在这里错过了什么吗?据我在 Apache 文档和论坛中读到的,如果 getRow() 返回 null,我

  • 我在使用Guice时遇到空值问题。Nex我向您展示了一个类似场景的示例。我知道字段注入是一种不好的做法,但我希望它在演示中像这样工作 我有具体类命名为B(这是我要注入的一个): 我有一个名为A的抽象类,它有类B(我想通过字段注入注入的那个): 现在是另一个扩展A的具体类C: 我的GUI配置如下: 然后我对斯波克进行了测试: 谢谢:)

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null

  • 问题内容: 我正在使用Servlets&Struts2的混合情况下工作。 我正在调用HTTPServlet,并且正在处理数据。 然后,我需要调用struts API在DB中插入数据。 在那我也使用HTTPSession。 所以我打电话 要获取HttpRequest,然后在该struts动作类中进行会话。 Servlet正在调用Struts Action类。 但 始终返回NULL。 是因为它没有被网