Comment faire de la toile Redimensionnable en javaFX?
En javaFX pour redimensionner une toile, il y a pas une telle méthode pour le faire, la seule solution est de s'étend à partir d'une Toile.
class ResizableCanvas extends Canvas {
public ResizableCanvas() {
//Redraw canvas when size changes.
widthProperty().addListener(evt -> draw());
heightProperty().addListener(evt -> draw());
}
private void draw() {
double width = getWidth();
double height = getHeight();
GraphicsContext gc = getGraphicsContext2D();
gc.clearRect(0, 0, width, height);
}
@Override
public boolean isResizable() {
return true;
}
}
est s'étend de la Toile est la seule solution pour faire de la toile Redimensionnable ?
parce que cette solution fonctionne que si nous ne voulons pas utiliser FXML, si nous déclarons dans le fxml une toile comment pouvons-nous en faire redimensionnable?
c'est mon code :
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main extends Application {
Controller controller;
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
AnchorPane root = loader.load(); //controller initialized
controller = loader.getController();
GraphicsContext gc = controller.canvas.getGraphicsContext2D();
gc.setFill(Color.AQUA);
gc.fillRect(0, 0, root.getPrefWidth(), root.getPrefHeight());
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(controller.Pane, controller.Pane.getPrefWidth(), controller.Pane.getPrefHeight()));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
- Pourquoi cette solution fonctionne pas si vous utilisez FXML?
- si j'utilise la solution , je vais affecter un objet de la classe à la toile de FXML , la toile sera redimensionnable mais quand je compile le code de la toile n'est pas visible, je ne sais pas pourquoi.
- En regardant ton code... je pense que probablement
root.getPrefWidth()
etroot.getPrefHeight()
ne sont pas de donner ce que vous attendez. Pour tester, juste essayer de coder en dur quelque chose et voir si cela fonctionne. Aussi, êtes-vous le réglage de la largeur et de la hauteur de la toile dans FMXL? - J'ai changé de racine.getPrefWidth() pour
controller.Pane.getPrefWidth();
il fonctionne. le seul problème est la toile n'est pas redimensionnable. c'est de la toile dans le FXML:<Canvas fx:id="canvas" height="267.0" layoutX="13.0" layoutY="9.0" width="450.0" AnchorPane.bottomAnchor="8.0" AnchorPane.leftAnchor="13.0" AnchorPane.rightAnchor="12.0" AnchorPane.topAnchor="9.0" />
- Pourquoi ne pas simplement utiliser votre
Canvas
sous-classe dans le FXML?<ResizableCanvas fx:id="canvas" ... />
Assurez-vous d'avoir le bon importation pour elle. - Je ne savais pas qu'on peut le faire lol merci ! x)
Vous devez vous connecter pour publier un commentaire.
Il y a un guide que j'ai pense que vous pourriez trouver utiles pour la mise en place d'un redimensionnable toile:
JavaFx pointe - redimensionnable toile
Prises de http://werner.yellowcouch.org/log/resizable-javafx-canvas/: Pour faire un JavaFx toile redimensionnable tout ce qui doit être fait est de remplacer le min/pref/max méthodes. Faire redimensionnable et de mettre en œuvre la méthode de redimensionnement.
Avec cette méthode, pas de largeur/hauteur auditeurs sont nécessaires pour déclencher une redessiner. Il n'est également plus nécessaire de lier la taille de la largeur et de la hauteur du conteneur.
La classe canvas juste besoin de remplacer isResizable() (tout le reste, ce qui est suggéré dans d'autres exemples, n'est en fait pas nécessaire) :
Et dans l'Application de la largeur et de la hauteur de la toile doivent être liés à la toile parent:
Les auditeurs peuvent être ajoutés à la largeur et la hauteur de propriétés, pour redessiner la toile, lorsqu'elle est redimensionnée (mais si vous avez besoin et où la placer, dépend de votre application):
J'ai trouvé que les solutions ci-dessus ne fonctionne pas lorsque la toile est contenue dans une HBox, comme le HBox ne serait pas réduite lorsque la fenêtre est redimensionnée, car il serait le clip de la toile. Ainsi, le HBox permettrait d'élargir, mais n'atteignent jamais des tout petits.
J'ai utilisé le code suivant pour que la toile s'adapter à la conteneur:
Et dans ma classe de contrôleur: