我正在尝试使用我的数据库的第一张图像设置imageView img_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 { 试试{
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,而是在路径中指定我设置为哪个类控制器?
@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());
}
}
答案 0 :(得分:0)
问题是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
你不必。你要么使用
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>
您的控制器是fx:controller="package.GUIController"
中指定的类,loader.getController()
将返回GUIController
类的实例。
答案 1 :(得分:0)
如果你的目标是用新场景打开新窗口,我认为这会更合适。首先,创建新阶段,加载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);