Ich habe eine Klasse namens "AdjustmentBar", die eine ImageView, eine Menüleiste und einige Bildbearbeitungsfunktionen (eine FXML-Datei und ein Controller) enthält. AdjustmentBar wird in eine andere Klasse namens "ExaminationDisplayer" (auch eine FXML-Datei und ein Controller) geladen. ExaminationDisplayer lädt einige Bilder aus einer Online-MySQL-Datenbank, und ich möchte, dass jedes dieser Bilder in einem separaten Bild angezeigt wird.Javafx setImage für ImageView von einem anderen FXML-Controller
Ich konnte die AdjustmentBar in den ExaminationDisplayer laden, aber ich kann nicht herausfinden, wie ImageImage() des imageView gesetzt wird, das in AdjustmentBar enthalten ist. Ich kann ein Bild von der Datenbank in einer Bildansicht anzeigen, die ich speziell im ExaminationDisplayer mache, und ich kann ein Bild in der AdjustmentBar-Ansicht anzeigen, wenn ich das separat ausführe. Ich kann die geladene Justierungsleiste nicht aufrufen, um das Bild im ExaminationDisplayer anzuzeigen.
Wenn ich es laufen bekomme ich einen Fehler Nullpointer für diese Codezeile: imgView.setImage (Bild), die in dem ExaminationDisplayerController ist:
public class ExaminationDisplayerController extends AdjustmentBarController {
@FXML
private void handlebtnFraminghamAction(ActionEvent event) throws IOException {showCardiacConditionEstimator(); }
@FXML
private AnchorPane anchorPane;
@FXML
private LineChart<Number, Number> lcChart;
@FXML
private NumberAxis xAxis; // x-Axis is defined
@FXML
private NumberAxis yAxis; //y-Axis is defined
public void initialize() throws ClassNotFoundException, SQLException, IOException { // Loading methods in ExaminationDisplayerController
SPECTLoad();
}
public void showCardiacConditionEstimator() throws IOException { // Method for displaying CardiacConditionEstimator
Parent parent = FXMLLoader.load(getClass().getResource("/fxml/CardiacConditionEstimator.fxml")); //Reference to the fxml file
Stage stage = new Stage(); // creating a new stage
Scene scene = new Scene(parent); // creating a new scene for the file to be shown onto
stage.setScene(scene); // sets the scene on the stage
stage.show(); // Displaying the stage
stage.setMaximized(false); // maximizing the stage
}
public void SPECTLoad() throws SQLException, ClassNotFoundException {
DBConnection dbConn = new DBConnection();
Connection conn = dbConn.connect();
PreparedStatement pstmt = null;
try {
for (int numberOfExaminations = 0; numberOfExaminations < 3; numberOfExaminations++) {
String[] ID = {"1111", "1112", "1113"};
List<String> chosenExaminations = Arrays.asList(ID);
String SQL = "SELECT `IMAGE` FROM `SPECT` WHERE `ID` = ?;";
pstmt = conn.prepareStatement(SQL);
pstmt.setString(1, chosenExaminations.get(numberOfExaminations));
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
InputStream is = rs.getBinaryStream("IMAGE");
OutputStream os = new FileOutputStream(new File("SPECT_IMAGE.jpg"));
byte[] content = new byte[1024];
int size = 0;
while ((size = is.read(content)) != -1) { // Når inputstream er real passer den et -1 værdi og så stoppes loopet
os.write(content, 0, size);
}
os.close();
is.close();
Image image = new Image(new File("SPECT_IMAGE.jpg").toURI().toString(), 200, 200, true, true);
anchorPane.getChildren().add(FXMLLoader.load(getClass().getResource("/fxml/AdjustmentBar.fxml")));
imgView.setImage(image);
}
}
//}
} catch (Exception e) {
e.printStackTrace();
}
}
Hier ist der Code für AdjustmentBarController:
public class AdjustmentBarController {
@FXML
private AnchorPane AnchorPane;
@FXML
private ScrollPane ScrollPane;
@FXML
public ImageView imgView;
@FXML
private Slider contrastAdjuster;
@FXML
private ToggleButton btnMeasure;
@FXML
private Pane imgContainer;
@FXML
private Label txtLabel;
@FXML
private void btnZoomInAction(ActionEvent event) {...}
@FXML
private void btnZoomOutAction(ActionEvent event) {...}
@FXML
private void btnRotateRightAction(ActionEvent event) {...}
@FXML
private void btnRotateLeftAction(ActionEvent event) {...}
/**
* Initializes the controller class.
*
* @param url
* @param rb
*/
public void initialize(URL url, ResourceBundle rb
) {
contrastAdjuster.valueProperty().addListener((observable, oldValue, newValue) -> {
double value = contrastAdjuster.getValue();
ColorAdjust colorAdjust = new ColorAdjust();
colorAdjust.setContrast(value);
imgView.setEffect(colorAdjust);
});
}
}
ich bin mir nicht sicher, ob die FXML Datei für AdjustmentBar relevant ist, aber hier geht:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<AnchorPane id="AnchorPane" prefHeight="435.0" prefWidth="435.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Multimodality.controller.AdjustmentBarController">
<children>
<BorderPane prefHeight="435.0" prefWidth="435.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<center>
<ScrollPane fx:id="ScrollPane" pannable="true" prefHeight="435.0" prefWidth="435.0" BorderPane.alignment="CENTER">
<content>
<Pane fx:id="imgContainer">
<children>
<ImageView fx:id="imgView" fitHeight="400.0" fitWidth="400.0" nodeOrientation="INHERIT" pickOnBounds="true" preserveRatio="true" />
<Label fx:id="txtLabel" alignment="TOP_LEFT" layoutX="336.0" layoutY="-1.0" prefHeight="134.0" prefWidth="75.0" wrapText="true" />
</children>
</Pane>
</content>
</ScrollPane>
</center>
<bottom>
<HBox alignment="CENTER" prefHeight="35.0" prefWidth="435.0" spacing="8.0" BorderPane.alignment="CENTER">
<children>
<Button fx:id="btnZoomOut" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnZoomOutAction" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/icon_zoomout.png" />
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="btnZoom100" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnZoom100Action" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/icon_fit.png" />
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="btnZoomIn" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnZoomInAction" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/icon_zoomin.png" />
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="btnRotateRight" contentDisplay="CENTER" graphicTextGap="0.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnRotateRightAction" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/shape_rotate_clockwise.png" />
</image>
</ImageView>
</graphic>
</Button>
<Button fx:id="btnRotateLeft" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnRotateLeftAction" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/shape_rotate_anticlockwise.png" />
</image>
</ImageView>
</graphic>
</Button>
<ToggleButton fx:id="btnMeasure" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#btnMeasureAction" prefHeight="25.0" prefWidth="25.0">
<graphic>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/ruler.png" />
</image>
</ImageView>
</graphic>
</ToggleButton>
<ImageView fitHeight="20.0" fitWidth="20.0" preserveRatio="true">
<image>
<Image url="/img/contrast.png" />
</image>
<HBox.margin>
<Insets left="8.0" right="-2.0" />
</HBox.margin>
</ImageView>
<Slider fx:id="contrastAdjuster" blockIncrement="0.1" majorTickUnit="0.5" max="1.0" min="-1.0" minorTickCount="4" prefHeight="24.0" prefWidth="128.0" showTickMarks="true" />
</children>
<BorderPane.margin>
<Insets />
</BorderPane.margin>
</HBox>
</bottom>
</BorderPane>
</children>
</AnchorPane>
Last but not least, hier ist die Nullpointer ich, wenn ich den Code ausführen:
java.lang.NullPointerException
at Multimodality.controller.ExaminationDisplayerController.SPECTLoad(ExaminationDisplayerController.java:224)
at Multimodality.controller.ExaminationDisplayerController.initialize(ExaminationDisplayerController.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at Multimodality.controller.ExaminationOverviewController.showExaminationDisplayer(ExaminationOverviewController.java:352)
at Multimodality.controller.ExaminationOverviewController.btnChooseExaminationsAction(ExaminationOverviewController.java:341)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8413)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
BUILD SUCCESSFUL
Total time: 52.909 secs
Ich hoffe, dass einige von euch kann mir helfen! Vielen Dank im Voraus :-)
Zwei Aussagen verwirrt mich - „AdjustmentBar ist geladen in eine andere Klasse namens "ExaminationDisplayer" und "Ich konnte die AdjustmentBar in den ExaminationDisplayer laden"? Auch ich kann sehen, dass Ihre ExaminationDisplaye rController erweitert AdjustmentBarController, aber es scheint nicht richtig zu sein. Können Sie etwas Licht auf das werfen, was Sie hier erreichen wollen? – ItachiUchiha
@ItachiUchiha Hallo! Ja, der ExaminationDisplayer lädt Bilder aus einer Datenbank und sollte diese in einem imageView anzeigen.Ich möchte jedoch nicht, dass es ein normales ImageView ist, sondern es sollte das sein, das ich in AdjustmentBar entworfen habe - weil es auch eine Werkzeugleiste hat, die es mir erlaubt, den Kontrast für jedes ImageView zu vergrößern/zu drehen/einzustellen . Ich konnte nicht imgView (das ist die fixID des ImageView von AdjustmentBar) aufrufen, wenn ich nicht den "extend" -Befehl hinzugefügt habe - aber vielleicht stimmt das gar nicht. Ich hoffe, das macht Sinn! Ich habe auch den Fehler hinzugefügt, den ich auf den Post bekomme. :-) – Heidi
@ItachiUchiha Das heißt, ich habe eine FXML-Datei namens ExaminationDisplayer, die eine andere FXML-Datei namens AdjustmentBar lädt/öffnet/anzeigt. Wie viele AdjustmentBar-ImageViews geladen werden, hängt davon ab, wie viele Bilder ich gleichzeitig anzeigen möchte. Es könnte nur einer sein, aber normalerweise sind es drei oder vier. – Heidi