दिलचस्प पोस्ट
दृश्य स्टूडियो 2008 एक्सप्रेस संस्करणों में "गायब" क्या है? TextInputLayout का फ़्लोटिंग लेबल रंग बदलने के लिए कैसे करें पीडीओ के लिए real_escape_string () के बराबर क्या है? क्रॉस प्लेटफॉर्म (पीएचडी टू सी # .नेट) एन्क्रिप्शन / डिक्रिप्शन के साथ रिजेंडेल मैं ईएफ डीबीसीॉन्टेक्स मेटाडेटा प्रोग्राम को कैसे पढ़ सकता हूं? GluSphere () का उपयोग किए बिना ओपनजीएल में क्षेत्र को आकर्षित करना? जब एक 'धुंधला' घटना होती है, तो मैं यह कैसे पता लगा सकता हूँ कि कौन सा तत्व फोकस * * पर गया? GetMapAsync के साथ getMap को बदलें जावास्क्रिप्ट वस्तु कुंजी नाम प्राप्त करें पंडों to_html () स्ट्रिंग सामग्री को छांटती है JSON के लिए जावास्क्रिप्ट एसोसिएटिव सरणी क्या प्लेटफार्मों में कुछ 8-बिट वर्णों के अलावा कुछ है? मैं रेल में एक अलग प्रारूप का आंशिक कैसे रेंडर कर सकता हूं? आप फ़ोल्डर के लिए सबवर्सन नियंत्रण कैसे निकाल सकते हैं? क्यों मेरे खेतों को शून्य या डिफ़ॉल्ट मान के शून्य के लिए शुरू किया जाता है, जब मैंने उन्हें घोषित किया और उन्हें अपने वर्ग के निर्माता में आरम्भ किया?

संलग्न किए गए अभिभावक को भरने के लिए कैनवास का स्वचालित रूप से आकार बदलें

मैं हाल ही में JavaFX में एक एनिमेटेड पृष्ठभूमि बनाना चाहता था, यहां देखा स्विंग उदाहरण के समान। मैंने एक Canvas उपयोग किया था, जिस पर आकर्षित करना था, जैसा कि कैनवास एपीआई के साथ वर्किंग में दिखाया गया है, और ड्राइंग लूप के लिए AnimationTimer टाइमर, जैसा कि एनीमेशन बेसिक्स में दिखाया गया है। दुर्भाग्यवश, मुझे यकीन नहीं है कि Canvas स्वचालित रूप से आकार देने के तरीके के रूप में संलग्न Stage का आकार बदल दिया गया है। एक अच्छा दृष्टिकोण क्या है?

छवि

वेब के समाधान से एकत्रित समाधान "संलग्न किए गए अभिभावक को भरने के लिए कैनवास का स्वचालित रूप से आकार बदलें"

नीचे दिए गए उदाहरण में, स्थिर नेस्टेड क्लास CanvasPane एक Pane में Canvas का एक उदाहरण लपेटता है और layoutChildren() ओवरराइड layoutChildren() ताकि कैनवास आयाम को संलग्न Pane मेल कर सके। ध्यान दें कि Canvas isResizable() से false रिटर्न करता है, इसलिए "माता-पिता लेआउट के दौरान इसका आकार बदल नहीं सकते हैं," और Pane "आकार बदलने योग्य बच्चों को अपने पसंदीदा आकारों में रीसाइज़ करने के लिए लेआउट नहीं करता है।" कैनवास के निर्माण के लिए इस्तेमाल की जाने वाली width और height इसकी प्रारंभिक आकार होती है एक समान दृष्टिकोण एन्सेबल कण सिमुलेशन, Fireworks.java में इस्तेमाल किया जाता है, ताकि इसकी आकृति अनुपात को बनाए रखते हुए पृष्ठभूमि की छवि को स्केल किया जा सके।

एक तरफ, मूल की तुलना में पूरी तरह संतृप्त रंगों का उपयोग करने में अंतर को ध्यान में रखें। ये संबंधित उदाहरण एनिमेटेड पृष्ठभूमि के ऊपर नियंत्रण रखने की व्याख्या करते हैं।

छवि

 import java.util.LinkedList; import java.util.Queue; import java.util.Random; import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.beans.Observable; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.CheckBox; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * @see https://stackoverflow.com/a/31761362/230513 * @see https://stackoverflow.com/a/8616169/230513 */ public class Baubles extends Application { private static final int MAX = 64; private static final double WIDTH = 640; private static final double HEIGHT = 480; private static final Random RND = new Random(); private final Queue<Bauble> queue = new LinkedList<>(); private Canvas canvas; @Override public void start(Stage stage) { CanvasPane canvasPane = new CanvasPane(WIDTH, HEIGHT); canvas = canvasPane.getCanvas(); BorderPane root = new BorderPane(canvasPane); CheckBox cb = new CheckBox("Animate"); cb.setSelected(true); root.setBottom(cb); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); for (int i = 0; i < MAX; i++) { queue.add(randomBauble()); } AnimationTimer loop = new AnimationTimer() { @Override public void handle(long now) { GraphicsContext g = canvas.getGraphicsContext2D(); g.setFill(Color.BLACK); g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); for (Bauble b : queue) { g.setFill(bc); g.fillOval(bx, by, bd, bd); } queue.add(randomBauble()); queue.remove(); } }; loop.start(); cb.selectedProperty().addListener((Observable o) -> { if (cb.isSelected()) { loop.start(); } else { loop.stop(); } }); } private static class Bauble { private final double x, y, d; private final Color c; public Bauble(double x, double y, double r, Color c) { this.x = x - r; this.y = y - r; this.d = 2 * r; this.c = c; } } private Bauble randomBauble() { double x = RND.nextDouble() * canvas.getWidth(); double y = RND.nextDouble() * canvas.getHeight(); double r = RND.nextDouble() * MAX + MAX / 2; Color c = Color.hsb(RND.nextDouble() * 360, 1, 1, 0.75); return new Bauble(x, y, r, c); } private static class CanvasPane extends Pane { private final Canvas canvas; public CanvasPane(double width, double height) { canvas = new Canvas(width, height); getChildren().add(canvas); } public Canvas getCanvas() { return canvas; } @Override protected void layoutChildren() { super.layoutChildren(); final double x = snappedLeftInset(); final double y = snappedTopInset(); final double w = snapSize(getWidth()) - x - snappedRightInset(); final double h = snapSize(getHeight()) - y - snappedBottomInset(); canvas.setLayoutX(x); canvas.setLayoutY(y); canvas.setWidth(w); canvas.setHeight(h); } } public static void main(String[] args) { launch(args); } } 

क्या आप ऐसा Binding साथ भी नहीं कर सकते? निम्नलिखित व्युत्पन्न वर्ग को जोड़ने के बिना समान परिणाम उत्पन्न करने लगता है।

 import java.util.LinkedList; import java.util.Queue; import java.util.Random; import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.beans.Observable; import javafx.beans.binding.DoubleBinding; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.CheckBox; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * @see http://stackoverflow.com/a/31761362/230513 * @see http://stackoverflow.com/a/8616169/230513 */ public class Baubles extends Application { private static final int MAX = 64; private static final double WIDTH = 640; private static final double HEIGHT = 480; private static final Random RND = new Random(); private final Queue<Bauble> queue = new LinkedList<>(); private Canvas canvas; @Override public void start(Stage stage) { canvas = new Canvas(WIDTH, HEIGHT); BorderPane root = new BorderPane(canvas); CheckBox cb = new CheckBox("Animate"); cb.setSelected(true); root.setBottom(cb); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); // Create bindings for resizing. DoubleBinding heightBinding = root.heightProperty() .subtract(root.bottomProperty().getValue().getBoundsInParent().getHeight()); canvas.widthProperty().bind(root.widthProperty()); canvas.heightProperty().bind(heightBinding); for (int i = 0; i < MAX; i++) { queue.add(randomBauble()); } AnimationTimer loop = new AnimationTimer() { @Override public void handle(long now) { GraphicsContext g = canvas.getGraphicsContext2D(); g.setFill(Color.BLACK); g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); for (Bauble b : queue) { g.setFill(bc); g.fillOval(bx, by, bd, bd); } queue.add(randomBauble()); queue.remove(); } }; loop.start(); cb.selectedProperty().addListener((Observable o) -> { if (cb.isSelected()) { loop.start(); } else { loop.stop(); } }); } private static class Bauble { private final double x, y, d; private final Color c; public Bauble(double x, double y, double r, Color c) { this.x = x - r; this.y = y - r; this.d = 2 * r; this.c = c; } } private Bauble randomBauble() { double x = RND.nextDouble() * canvas.getWidth(); double y = RND.nextDouble() * canvas.getHeight(); double r = RND.nextDouble() * MAX + MAX / 2; Color c = Color.hsb(RND.nextDouble() * 360, 1, 1, 0.75); return new Bauble(x, y, r, c); } public static void main(String[] args) { launch(args); } }