2014-05-03 11 views
6

मैं अपने स्तर संपादक के जीयूआई पर काम कर रहा हूं जिसे मैंने जावाएफएक्स में बनाया है, और मैं नए स्प्लिट फलक आयामों में कैनवास ऑब्जेक्ट का आकार बदलने में सक्षम होना चाहता हूं। ऐसा लगता है कि मैंने कोशिश की सब कुछ विफल हो गया है। इसमें फलक ऑब्जेक्ट को पास करना और विंडो की आकार श्रोताओं का उपयोग करके और इसकी चौड़ाई और ऊंचाई संपत्ति को बाध्यकारी फलक के साथ बाध्य करना सीधे इसकी चौड़ाई का उपयोग करना शामिल है। कोई विचार। यह वही है एक आकार बदलने से पहले की तरह घरों में शौचालय है:जावाएफएक्स - स्क्रीन का आकार बदलते समय कैनवास का आकार बदलें

enter image description here

और एक आकार बदलने के बाद:

enter image description here

किसी को भी किसी भी विचार hasve है। कक्षा के लिए कोड बहुत व्यापक है, लेकिन आकार बदलने के लिए कोड शामिल किया जाएगा।

public Canvas canvas; 
public String tabTitle; 
public VBox layout; 
public GraphicsContext g; 
public Core core; 

public CanvasTab(Core core, String tabTitle){ 
    this.core = core; 
    this.canvas = new Canvas(core.scene.getWidth() - 70, core.scene.getHeight() - 70); 
    layout = VBoxBuilder.create().spacing(0).padding(new Insets(10, 10, 10, 10)).children(canvas).build(); 

    this.g = canvas.getGraphicsContext2D(); 

    g.setFill(Color.BLACK); 
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 

    HBox.setHgrow(layout, Priority.ALWAYS); 

    this.setContent(layout); 
    this.setText(tabTitle); 

    canvas.widthProperty().bind(layout.widthProperty().subtract(20)); 
    canvas.heightProperty().bind(layout.heightProperty().subtract(20)); 
} 

public CanvasTab(Canvas canvas){ 
    this.canvas = canvas; 
} 
+1

कैनवास सही ढंग से आकार बदल रहा है (मुझे लगता है), लेकिन कैनवास टैब का निर्माण होने पर आप कैनवास के आकार के लिए काले आयताकार भरते हैं। यदि आप एक कैनवास का उपयोग करने जा रहे हैं, और इसे फिर से आकार देना चाहते हैं, तो आपको शायद आकार बदलने पर सब कुछ (या कम से कम कुछ चीजें) फिर से खींचने की आवश्यकता होगी। –

उत्तर

10

जेम्स_D ने बताया कि आकार बदलने पर आपको अपने कैनवास की सामग्री को फिर से निकालना होगा। इस प्रकार अपने कैनवास 'चौड़ाई और ऊंचाई संपत्ति के लिए एक श्रोता जोड़कर किया जा सकता है:

InvalidationListener listener = new InvalidationListener(){ 
    @Override 
    public void invalidated(Observable o) { 
     redraw();  
    }   
}); 
canvas.widthProperty().addListener(listener); 
canvas.heightProperty().addListener(listener); 

या जावा 8 में कार्यात्मक इंटरफेस का उपयोग कर:

canvas.widthProperty().addListener(observable -> redraw()); 
canvas.heightProperty().addListener(observable -> redraw()); 

जहां redraw() अपनी खुद की विधि है जो विचार करेंगे आपके उदाहरण के लिए इस तरह (एक काले रंग की आयत बनाकर:।

private void redraw() { 
    g.setFill(Color.BLACK); 
    g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
} 
+1

मेरे सीमित अनुभव में, आपको दृश्य की चौड़ाई प्राप्त करना होगा प्रॉपर्टी और ऊंचाईप्रॉपर्टी, कैनवास की नहीं: https://blog.idrsolutions.com/2012/11/adding-a-window-resize-listener-to-javafx-scene/ – bbarker

5

एक JavaFX कैनवास सभी आकार बदलने योग्य है कि किया जाना चाहिए मिनट/वरी/अधिकतम तरीकों को ओवरराइड है बनाने के लिए यह आकार बदलने योग्य बनाने और आकार बदलने का तरीका लागू करें।

इस विधि के साथ कोई रेड्रो ट्रिगर करने के लिए कोई चौड़ाई/ऊंचाई श्रोताओं की आवश्यकता नहीं है। कंटेनर के लिए चौड़ाई और ऊंचाई के आकार को बांधना अब भी आवश्यक नहीं है।

public class ResizableCanvas extends Canvas { 

@Override 
public double minHeight(double width) 
{ 
    return 64; 
} 

@Override 
public double maxHeight(double width) 
{ 
    return 1000; 
} 

@Override 
public double prefHeight(double width) 
{ 
    return minHeight(width); 
} 

@Override 
public double minWidth(double height) 
{ 
    return 0; 
} 

@Override 
public double maxWidth(double height) 
{ 
    return 10000; 
} 

@Override 
public boolean isResizable() 
{ 
    return true; 
} 

@Override 
public void resize(double width, double height) 
{ 
    super.setWidth(width); 
    super.setHeight(height); 
    paint(); 
} 

ध्यान दें कि आकार बदलने विधि बस, Node.resize (चौड़ाई, ऊंचाई) कॉल नहीं कर सकते मानक कार्यान्वयन effectivele रिक्त है क्योंकि।

+0

यह जवाब सोना है! – GOXR3PLUS

संबंधित मुद्दे