Hey! - Bezüglich eines privaten Projekt habe ich ein Custom Control welches ein ImageView beinhaltet. Das Control möchte ich von der Größe her beeinflussen. Allerdings fehlt es mir an Kenntnis (und die Dokumentation war für mich da nicht wirklich einleuchtend) wie ich das bewerkstellige.
Zuerst einmal zu dem Code. Der Einfachheitshalber habe ich den Beispielcode alles im default package gespeichert.
Scene.fxml
Main.java
MyImage.java
MyImageSkin.java
Das Bild wird mir soweit angezeigt. Ich weiß, dass ich das Bild selber (in der ImageView) mithilfe von .setFitWidth() und .setFitHeight() von der Größe verändern kann. Allerdings wird von außen ein normales Control (sei es ein Button, Label oder was auch immer) über die Methoden .setMaxHeight(), .setMaxWidth(), .setPrefWidth(), .setPrefHeight(), .setMinWidth() und .setMinHeight() von der Größe beeinflusst. Die Frage ist nun, wie implementiert man das korrekt in einem Custom Control?
Vielleicht noch eine andere Verständnisfrage dazu:
Mir ist nicht ganz ersichtlich wann man nun .setPrefWidth() / .setPrefHeight() benutzt und wann man lieber mit .setMaxWidth() und .setMaxHeight() arbeiten sollte. Wo ist der Unterschied?
Zuerst einmal zu dem Code. Der Einfachheitshalber habe ich den Beispielcode alles im default package gespeichert.
Scene.fxml
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.Scene?>
<?import javafx.scene.layout.Pane?>
<Scene xmlns:fx="http://javafx.com/fxml/1">
<width>800</width>
<height>600</height>
<Pane fx:id="pane">
</Pane>
</Scene>
Main.java
Java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(Main.class, args);
}
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader fxml = new FXMLLoader(Main.class.getResource("Scene.fxml"));
Scene scene = fxml.load();
Pane pane = (Pane) fxml.getNamespace().get("pane");
Image image = new Image("http://3hppfzjby0g1sxwjng1f4h1c-wpengine.netdna-ssl.com/wp-content/uploads/2011/07/photodune-9297562-example-stamp-xs.jpg");
MyImage control = new MyImage(image);
pane.getChildren().add(control);
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.centerOnScreen();
}
}
MyImage.java
Java:
import javafx.scene.control.Control;
import javafx.scene.control.Skin;
import javafx.scene.image.Image;
public class MyImage extends Control {
private Image image;
public MyImage(Image image) {
this.image = image;
}
@Override
protected Skin<?> createDefaultSkin() {
return new MyImageSkin(this);
}
public Image getImage() {
return image;
}
}
MyImageSkin.java
Java:
import javafx.scene.control.SkinBase;
import javafx.scene.image.ImageView;
public class MyImageSkin extends SkinBase <MyImage> {
private ImageView imageView;
protected MyImageSkin(MyImage control) {
super(control);
imageView = new ImageView();
imageView.setImage(control.getImage());
getChildren().add(imageView);
}
}
Das Bild wird mir soweit angezeigt. Ich weiß, dass ich das Bild selber (in der ImageView) mithilfe von .setFitWidth() und .setFitHeight() von der Größe verändern kann. Allerdings wird von außen ein normales Control (sei es ein Button, Label oder was auch immer) über die Methoden .setMaxHeight(), .setMaxWidth(), .setPrefWidth(), .setPrefHeight(), .setMinWidth() und .setMinHeight() von der Größe beeinflusst. Die Frage ist nun, wie implementiert man das korrekt in einem Custom Control?
Vielleicht noch eine andere Verständnisfrage dazu:
Mir ist nicht ganz ersichtlich wann man nun .setPrefWidth() / .setPrefHeight() benutzt und wann man lieber mit .setMaxWidth() und .setMaxHeight() arbeiten sollte. Wo ist der Unterschied?