2012-10-22 16 views
17

ऐसा प्रतीत होता है कि Java FX 2.2 में टेक्स्ट स्ट्रिंग की चौड़ाई (पिक्सेल में) की गणना करने के लिए कोई API कॉल नहीं है। अन्य मंचों पर कामकाज के सुझाव दिए गए हैं, लेकिन किसी भी कोड को बनाने या खोजने के मेरे प्रयास जो स्ट्रिंग की चौड़ाई लौटाते हैं, या तो डिफ़ॉल्ट फ़ॉन्ट का उपयोग करते हैं या अन्यथा विफल हो जाते हैं। किसी भी सहायता की सराहना की जाएगी।जावाएफएक्स में स्ट्रिंग की पिक्सेल चौड़ाई की गणना कैसे करें?

उत्तर

27

तुम सिर्फ सीएसएस के बिना डिफ़ॉल्ट फ़ॉन्ट को मापने रहे हैं:

  1. प्लेस स्ट्रिंग एक पाठ वस्तु में मापा जाना चाहिए।
  2. टेक्स्ट ऑब्जेक्ट की लेआउट सीमाओं की चौड़ाई प्राप्त करें।

आप सीएसएस लागू करने के लिए की जरूरत है:

  1. प्लेस स्ट्रिंग एक पाठ वस्तु में मापा जाना चाहिए।
  2. एक फेंकने वाली दृश्य बनाएं और दृश्य वस्तु को दृश्य में रखें।
  3. (यदि आप जावा 7 का उपयोग कर रहे हैं) पाठ का एक स्नैपशॉट ले या जावा 8. के ​​लिए
  4. पाठ वस्तु के लेआउट सीमा से चौड़ाई जाओ applyCss कहते हैं।

यह काम करता है क्योंकि यह टेक्स्ट पर एक लेआउट पास को मजबूर करता है जो इसकी लेआउट सीमाओं की गणना करता है। चरण 2 में दृश्य आवश्यक है क्योंकि सीएसएस प्रोसेसर काम करता है (इसे अपनी नौकरी करने में सक्षम होने के लिए एक दृश्य में स्थित नोड की आवश्यकता होती है)। यदि आप प्रसंस्करण को और समझना चाहते हैं तो निश्चित रूप से लागू सीएसएस के लिए लिंक किए गए जावाडोक को पढ़ें।

नमूना कोड

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

// displays the width in pixels of an arbitrary piece of text. 
public class MeasureText extends Application { 
    public static void main(String[] args) { launch(args); } 
    @Override public void start(Stage stage) throws Exception { 
    final Text text = new Text("XYZZY"); 
    new Scene(new Group(text)); 

    // java 7 => 
    // text.snapshot(null, null); 
    // java 8 => 
    text.applyCss(); 

    final double width = text.getLayoutBounds().getWidth(); 

    stage.setScene(new Scene(new Label(Double.toString(width)))); 
    stage.show(); 
    } 
} 

नमूना कार्यक्रम निर्गम (पाठ की एक मनमाना टुकड़ा की पिक्सेल में चौड़ाई प्रदर्शित करता है):

Sample Program Output

कैसे (यदि सभी) होगा यह परिवर्तन अगर टेक्स्ट को ग्राफिक्स कॉन्टेक्स्ट पर सेट फ़ॉन्ट के साथ मुद्रित किया गया था?

एक ही संदेश आप कैनवास को साजिश जाएगा वाला एक पाठ वस्तु के लिए फ़ॉन्ट लागू करें। दृश्य ग्राफ पर प्लॉट किए गए पाठ को मापने के विपरीत, कैनवास में प्लॉट किए गए आइटमों में सीएसएस लागू नहीं होता है, इसलिए आपको टेक्स्ट ऑब्जेक्ट को एक दृश्य में रखने की आवश्यकता नहीं होती है और टेक्स्ट को मापने से पहले सीएसएस को लागू किया जाता है। आप अपने टेक्स्ट ऑब्जेक्ट की लेआउट सीमाओं को माप सकते हैं और यह उसी फ़ॉन्ट के साथ कैनवास के भीतर प्लॉट किए गए टेक्स्ट की सीमाओं के समान होगा।

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.*; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.*; 
import javafx.stage.Stage; 

// displays the width in pixels of an arbitrary piece of text (which has been plotted on a canvas). 
public class MeasureText extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     final String msg = "XYZZY"; 
     final Text text = new Text(msg); 
     Font font = Font.font("Arial", 20); 
     text.setFont(font); 

     final double width = text.getLayoutBounds().getWidth(); 

     Canvas canvas = new Canvas(200, 50); 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setFont(font); 
     gc.fillText(msg, 0, 40); 

     stage.setScene(new Scene(
       new VBox(new Label(Double.toString(width)), canvas)) 
     ); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

क्या यह उपकरण ओएस के अनुसार स्ट्रिंग की चौड़ाई की गणना करता है जो काम करता है यदि मैं विंडोज और मैक ओएक्स पर टेक्स्ट चौड़ाई की गणना करना चाहता हूं? –

+0

हां, ओएस के इस्तेमाल किए बिना, सही चौड़ाई वापस कर दी जाएगी। – jewelsea

+0

क्या यह समाधान स्नैपशॉट लेने से पहले पाठ पर शैली लागू होने पर स्टाइल टेक्स्ट के लिए भी खाता होगा? – Brendan

14

क्या इस बारे में:

Text theText = new Text(theLabel.getText()); 
theText.setFont(theLabel.getFont()); 
double width = theText.getBoundsInLocal().getWidth(); 

और यह काम करने ठीक लग रहा है:

float width = com.sun.javafx.tk.Toolkit.getToolkit().getFontLoader().computeStringWidth("", gc.getFont()); 
float height = com.sun.javafx.tk.Toolkit.getToolkit().getFontLoader().getFontMetrics(gc.getFont()).getLineHeight(); 
+3

इसका उपयोग यूनिट परीक्षणों और अन्यत्रों में भी किया जा सकता है, क्योंकि (स्नैपशॉट के विपरीत) इसे किसी FX एप्लिकेशन थ्रेड पर कोड निष्पादित करने की आवश्यकता नहीं होती है। –

+4

अफसोस की बात यह एक निराश पहुंच है ... यह जावा 8.25 – msj121

+0

के रूप में एपीआई पर नहीं है 'जीसी' क्या है ...? – Supuhstar

1
Bounds bounds = TextBuilder.create().text(text).font(font).build().getLayoutBounds(); 
double width=bounds.getWidth(); 
double height=bounds.getHeight();
+3

टेक्स्टबिल्डर को बहिष्कृत किया गया है। – msj121

+0

javafx 8 के लिए काम नहीं करता है, क्योंकि 'टेक्स्टबिल्डर' वर्ग हटा दी गई थी। – fabian

3

मैं इस कोशिश की।

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

  • कोई संबंधित समस्या नहीं^_^