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() et root.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)

InformationsquelleAutor HinoHara | 2014-07-02