Wie zur Leinwand zu machen Resizable in javaFX?
In javaFX, um die Größe einer Leinwand gibt es keine solche Methode zu tun, die einzige Lösung ist, erstreckt sich von der Leinwand.
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;
}
}
ist, erstreckt sich von der Leinwand ist die einzige Lösung, um die Leinwand der Größe veränderbar ?
da diese Lösung funktioniert nur, wenn wir nicht wollen, zu verwenden, FXML, erklären wir in fxml eine Leinwand wie können wir es machen, resizable?
dies ist mein 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);
}
}
- Warum wird diese Lösung nicht funktionieren, wenn Sie mit FXML?
- wenn ich die Lösung , werde ich Einfluss auf Objekt der Klasse canvas der FXML , die Leinwand der Größe veränderbar sein, aber wenn ich den code kompilieren die Leinwand ist nicht sichtbar, ich weiß nicht, warum.
- Blick auf Ihren code... ich denke wohl
root.getPrefWidth()
undroot.getPrefHeight()
sind nicht zu geben, was Sie erwarten. Zu testen, einfach versuchen hart zu codieren etwas und sehen, ob es funktioniert. Darüber hinaus sind Ihnen die Einstellung der Breite und Höhe des canvas in FMXL? - Ich änderte root.getPrefWidth (), um
controller.Pane.getPrefWidth();
es funktioniert. das problem ist nur die Leinwand ist nicht resizable. dies ist die Leinwand in 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" />
- Warum nicht einfach Ihre
Canvas
Unterklasse in der FXML?<ResizableCanvas fx:id="canvas" ... />
Nur sicherstellen, dass Sie die richtige importieren für Sie. - Ich wusste nicht, das können wir machen, lol, Dank ! x)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Anleitung, die ich denke, dass Sie nützlich finden können für den Aufbau einer skalierbaren Leinwand:
JavaFx Tipp - resizable-Leinwand
Entnommen http://werner.yellowcouch.org/log/resizable-javafx-canvas/: Um eine JavaFx canvas resizable alle, die getan werden muss, ist das überschreiben der min/pref/max-Methoden. Machen Sie es der Größe veränderbar und implementieren Sie die Methode resize (Größe anpassen.
Mit dieser Methode keine Breite/Höhe Zuhörer sind erforderlich, um trigger neu. Es ist auch nicht mehr notwendig, zu binden, die Größe der Breite und Höhe der container.
Canvas-Klasse muss nur überschreiben isResizable() (alles andere, was vorgeschlagen wird, in anderen Beispielen, ist wirklich nicht nötig) :
Sowie in der Anwendung der Eigenschaften width und height des canvas-Bereichs haben, gebunden zu sein, auf der Leinwand " parent:
Zuhörer können Hinzugefügt werden, um die Breite in der Höhe der Eigenschaften, um zu zeichnen das canvas-Bereich, wenn es geändert wird (aber wenn Sie das brauchen und wo Sie es platzieren, hängt von Ihrer Anwendung):
Fand ich, dass die oben genannten Lösungen nicht funktionieren, wenn die Leinwand ist, die in eine HBox, wie der HBox würde nicht schrumpfen, wenn das Fenster in der Größe geändert wird, denn Sie würde clip auf die Leinwand. So ist die HBox erweitern würden, aber nie erwachsen kleiner.
Ich verwendete den folgenden code, um die Leinwand passen die container:
Und in meiner controller-Klasse:
Alle Methoden gezeigt, diese war die einzige, die tatsächlich aus der Leinwand wirklich resizable:
Für mich, ich wollte nicht zu brechen, Kapselung zwingt den übergeordneten Komponente, senden Sie uns eine
width
undheight
; ich wollte auch nicht, um die Leinwand das einzige Kind in der Eltern werden durch die Aufnahme aller in dem Raum; und schließlich die Leinwand gezogen wird, um in einer anderen Klasse, so dass die Zeichnung Methode nicht Leben im inneren der Leinwand.Mit dieser Leinwand, brauche ich mich nicht zu binden, zu seinem übergeordneten width/height-Eigenschaften, um die Leinwand zu verkleinern. Es ist nur die Größe, mit was auch immer die Größe der Eltern wählt. Außerdem, wer mit der Leinwand kann nur eine Bindung an die width/height-Eigenschaften ein und verwalten Sie Ihre eigenen Zeichnung, wenn sich diese Eigenschaften ändern.