Ich verwende Java, um etwas Text zu zeichnen, aber es ist schwer für mich, die Breite der Zeichenfolge zu berechnen. zum Beispiel: zheng 中国 ... Wie lange wird diese Zeichenfolge belegen?Wie berechnet man die Schriftbreite?
Antwort
Für eine einzelne Zeichenfolge können Sie die Metriken für die angegebene Zeichnungsschriftart abrufen und daraus die Zeichenfolgengröße berechnen. Zum Beispiel:
String message = new String("Hello, StackOverflow!");
Font defaultFont = new Font("Helvetica", Font.PLAIN, 12);
FontMetrics fontMetrics = new FontMetrics(defaultFont);
//...
int width = fontMetrics.stringWidth(message);
Wenn Sie komplexere Textlayout Anforderungen haben, wie zum Beispiel eines Textabsatz innerhalb einer bestimmten Breite fließt, können Sie ein java.awt.font.TextLayout
Objekt, wie dieses Beispiel (aus der Dokumentation) erstellen:
Graphics2D g = ...;
Point2D loc = ...;
Font font = Font.getFont("Helvetica-bold-italic");
FontRenderContext frc = g.getFontRenderContext();
TextLayout layout = new TextLayout("This is a string", font, frc);
layout.draw(g, (float)loc.getX(), (float)loc.getY());
Rectangle2D bounds = layout.getBounds();
bounds.setRect(bounds.getX()+loc.getX(),
bounds.getY()+loc.getY(),
bounds.getWidth(),
bounds.getHeight());
g.draw(bounds);
Kann nicht instan tiate den Typ FontMetrics. –
Verwenden: FontMetrics fontMetrics = g.getFontMetrics(); –
java.awt.FontMetrics ist abstrakt; kann nicht instanziiert werden FontMetrics metrics = new FontMetrics (font); Ich fand irgendwo anders, dass Sie ein leeres Paar geschweifte Klammern nach der (Schriftart) und vor dem Semikolon setzen müssen. Ich habe keine Idee warum. FontMetrics metrics = new FontMetrics (font) {}; –
hier ist eine einfache Anwendung, die Sie, wie zeigen kann Fontmetrics verwenden, wenn die Breite eines String Prüfung:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUITest {
JFrame frame;
public static void main(String[] args){
new GUITest();
}
public GUITest() {
frame = new JFrame("test");
frame.setSize(300,300);
addStuffToFrame();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
frame.setVisible(true);
}
});
}
private void addStuffToFrame() {
JPanel panel = new JPanel(new GridLayout(3,1));
final JLabel label = new JLabel();
final JTextField tf = new JTextField();
JButton b = new JButton("calc sting width");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
FontMetrics fm = label.getFontMetrics(label.getFont());
String text = tf.getText();
int textWidth = fm.stringWidth(text);
label.setText("text width for \""+text+"\": " +textWidth);
}
});
panel.add(label);
panel.add(tf);
panel.add(b);
frame.setContentPane(panel);
}
}
bei dieser großen Präsentation Werfen Sie einen Blick, vor allem "Textmessung" Teil. Es erklärt verfügbare Größen und ihre Verwendung: Advanced Java 2D™ topics for Desktop Applications.
Einige weitere Informationen in Java2D FAQ: What is the difference between logical, visual and pixel bounds?
Link zu "Advanced Java 2D ™ Themen für Desktop-Anwendungen" ist tot. – dastrobu
Verwenden der getWidth Methode in der folgenden Klasse:
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
class StringMetrics {
Font font;
FontRenderContext context;
public StringMetrics(Graphics2D g2) {
font = g2.getFont();
context = g2.getFontRenderContext();
}
Rectangle2D getBounds(String message) {
return font.getStringBounds(message, context);
}
double getWidth(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getWidth();
}
double getHeight(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getHeight();
}
}
Sie es aus Font.getStringBounds finden():
String string = "Hello World";
// Passing or initializing an instance of Font.
Font font = ...;
int width = (int) font.getStringBounds(string, new FontRenderContext(font.getTransform(), false, false)).getBounds().getWidth();
Bitte erläutern Sie Ihre Lösung – Jens
- 1. Wie finde ich die Schriftbreite?
- 2. Wie berechnet man die Zeit?
- 3. Wie berechnet man Partituren?
- 4. Wie berechnet man die normale Matrix?
- 5. Wie berechnet man die Ausführungszeit eines Prozesses?
- 6. Wie berechnet man die Ausführungszeit einer Goroutine?
- 7. Wie berechnet man die gesamte zurückgelegte Strecke?
- 8. Wie berechnet man die Kaprekar-Zahlen besser?
- 9. Wie berechnet man die zeitliche Komplexität?
- 10. Wie berechnet man die oberen k Wörter
- 11. Wie berechnet man die Häufigkeitsverteilung in R?
- 12. Wie berechnet man die Inhaltshöhe von WKWebView?
- 13. Wie berechnet man die Fläche einer java.awt.geom.Area?
- 14. Wie berechnet man die Lösungszeit in MySQL?
- 15. Wie berechnet man "Ansichten"?
- 16. iOS/UIFont - Reduzierung der Schriftbreite
- 17. Pyephem: Wie berechnet man Transite?
- 18. Wie berechnet man den Netzwerkdurchmesser
- 19. Wie berechnet man freien Speicherplatz?
- 20. Wie berechnet man mit String?
- 21. Wie berechnet ggplot die Standardpausen?
- 22. Wie berechnet Python die Nummer?
- 23. Wie wird die Klassifikationsfehlerrate berechnet?
- 24. Wie berechnet man die Anzahl der Wochen bei 2 Daten?
- 25. Wie berechnet man die Anzahl der Monate zwischen zwei DateTimes?
- 26. Wie berechnet man die maximale Anzahl mit node.js?
- 27. Wie berechnet man die Flugbahn eines Geschosses in Unity2D?
- 28. Wie berechnet man die Standardabweichung mit einer Spalte "Zahl"?
- 29. Wie berechnet man die Faltung von zwei Vektoren ungleicher Länge
- 30. Wie berechnet man die Ortsfrequenz im Gabor-Filter?
Mögliche Duplikat von [ Berechnen Sie die Anzeigebreite eines Strings in Java] (http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a-string-in-java) – Zich