font.getBounds(String)

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo,

bevor ich die eig. Frage stelle, bin ich mal so dreist und schieb schnell eine kleine andere Frage ein: Wie stellt man nochmal den linestroke bei Graphics ein? Sodass zB ein rectangel nicht eine feine Linie hat, sondern eine dickere? Merci...

So, nun zur Frage:
Schon öfters wollte ich mir mal etwas basteln, dass mir die surrounding bounds von einem String ausrechnet. D.h. ich habe ein Panel, und einen Text per g.drawString. Jetzt möchte ich dass der zentriert angezeigt wird. Das hängt natürlich von der Schriftgrösse und -Art ab.
Was ich bräuchte wär eben eine Methode

[HIGHLIGHT="Java"]public Point getBounds(Font font, String text)[/HIGHLIGHT]

Ich hab jetzt in der Font Klasse nix dazu gefunden, dass mir irgendwie sagen könnte wie gross der Text dann im Endeffekt in Pixeln ist.

...hat da jmd eine Idee?

Vielen lieben Dank, lg
 
Ich kann nur die "Zwischenfrage" beantworten:
.setStroke()
z.B. .setStroke(new BasicStroke(2.0f));
das Wort linestroke in deiner Frage war ja schon sehr knapp dran 😀
 
Also, für gewöhnliche Objekte vom Typ Graphics ging das mit
Code:
g.getFontMetrics().stringWidth(str)
ganz gut, wenn man was zentrieren wollte...

Irgendwas mit "...2D" am Ende habe ich auf die schnelle auch gefunden:
Font (Java 2 Platform SE v1.4.2))
Ist es das? ???:L Würde mich auch mal interessieren...
 
Font hat die getStringBounds()-Methoden.
Die einfachste läuft dann über
Code:
Rectangle2D bounds = font.getStringBounds(string, graphics.getFontRendererContext());

Ob das dann aber besser ist als über graphics.getFontMetrics().stringWidth(string) sei dahin gestellt.
 
Also irgendwie haut das nicht hin.
Ich kann den String der Breite nach wunderbar zentrieren, nur die Höhe passt nicht.
Ich habe versucht mir einen Hilfscontainer zu machen:
JLabel -> setFont, setText, getPreferredSize.

...die Breite stimmt wie gesagt, aber die Höhe ist viel höher als der Text. Aber auch mit FontMetrics() und die anderen Vorschläge hier klappt es nicht. Ich krieg das Ding einfach nicht in die Mitte, der Höhe nach... Hab auch versucht mit so dingern wie font.getBaseline() und so weiter zu versuchen. Alles ohne Erfolg
 
Also irgendwie haut das nicht hin.
Ich kann den String der Breite nach wunderbar zentrieren, nur die Höhe passt nicht.
Ich habe versucht mir einen Hilfscontainer zu machen:
JLabel -> setFont, setText, getPreferredSize.

...die Breite stimmt wie gesagt, aber die Höhe ist viel höher als der Text. Aber auch mit FontMetrics() und die anderen Vorschläge hier klappt es nicht. Ich krieg das Ding einfach nicht in die Mitte, der Höhe nach... Hab auch versucht mit so dingern wie font.getBaseline() und so weiter zu versuchen. Alles ohne Erfolg
hdi, bist doch n megabyte und erfahrener benutzer^^ Beschwer dich nicht, sondern schmeiß mal lieber irgendwas kleines kompilierbares rüber, keine lust diese ganzen fenster anzulegen 😉
 
hdi keine Ahnung ob das ist was du brauchst oder meinst aber ich glaub das ist die lösung
[highlight=Java]
Font f = new Font
(
"Flubber",//Welche Schriftart
1, //Schräg, unterstrichen, fett oder anderes
20); //Schrift Größe
[/highlight]
Diesen Font machst du dann z.B. in ein Font wie hier
[highlight=Java]
Font f = new Font("Flubber",1, 20);
JLabel l;
l.setFont(f)M
[/highlight]
 
@Developer:

[HIGHLIGHT="Java"]JLabel l;
l.setFont(f); // Compile Error mit nur zwei Zeilen, n1[/HIGHLIGHT]

@Topic:
Hier mal n kompilierbares Test-Bsp:

[HIGHLIGHT="Java"]

package tests;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StringCenterProblem extends JFrame {

public static void main(String... x) {
new StringCenterProblem().setVisible(true);
}

public StringCenterProblem() {
super("demo");
setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

String txt = "?";
Font font = new Font("Arial", Font.BOLD, 100);

Point point = thisWasMyTry(txt, font, this.getWidth(), this
.getHeight());

g.setFont(font);
g.drawString(txt, point.x, point.y);
};
};
p.setPreferredSize(new Dimension(150, 150));

add(p);
pack();
setLocationRelativeTo(null);
}

private Point thisWasMyTry(String s, Font f, int width, int height) {

JLabel helpContainer = new JLabel();
helpContainer.setFont(f);
helpContainer.setText(s);
Dimension packed = helpContainer.getPreferredSize();

/* Hier is alles top! packed.widht is genauso breit wie der Buchsabe */
int x = width / 2 - packed.width / 2;

/*
* Problem hier: die packed.height ist viel grösser als der buchstabe im
* label
*/
int y = height / 2 + packed.height / 2;

return new Point(x, y);
}
}[/HIGHLIGHT]
 
Das die Höhe zu hoch ist, liegt wohl daran, das sich "FontMetrics.getHeight()" aus "...getLeading()" (Zeilenabstand), "...getAscent()" (Abstand Baseline - höchste Stelle) und "...getDescent()" (Abstand Baseline - niederigste Stelle) zusammensetzt. Für deine Zwecke müsstest du anstatt "...getHeight()" schlicht "...getAscent() + ...getDescent()" verwenden. "Font.getStringBounds()" verwendet auch alle drei Werte und kann deswegen auch nicht verwendet werden.
 
[highlight=Java]import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StringCenterProblem extends JFrame {

public static void main(String... x) {
new StringCenterProblem().setVisible(true);
}

public StringCenterProblem() {
super("demo");
setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

String txt = "?";
Font font = new Font("Arial", Font.BOLD, 100);
g.setFont(font);

FontMetrics fm = g.getFontMetrics();

int x = (getWidth()-fm.stringWidth(txt))/2;
int y = (getHeight()-fm.getHeight())/2+fm.getAscent();


g.drawString(txt, x, y);
};
};
p.setPreferredSize(new Dimension(200, 200));

add(p);
pack();
setLocationRelativeTo(null);
}
}[/highlight]

Das funktioniert bei mir
 
Zuletzt bearbeitet:
Spacerat, ich bekomm da nix mittiges raus...

edit: @Andre: Cool danke, funzt prima =)
 
andre ne hab das noch nicht gelesen, fand bisher "Schriftarten" nich sooo bombig interessant ;
Dachte auch nich, dass die Insel da n eigenes Kapitel für hat... Werd ich nachholen, nochmal danke
 
Ne... natürlich nicht. Du bekommst damit die eigentliche "Size" (also Breite und Höhe) des Strings raus. Ich weis doch nicht, auf welche Fläche du das zentrieren willst. Der allgemeine Zentrier-Algo (wenn ich das mal so bezeichnen darf) sollte ja bekannt sein.
Code:
posX = (panel.width - text.width) / 2;
posY = (panel.height - text.height) / 2;
 
Ja schon klar die Dimensionen des Panels hab ich auch reingerechnet. kA was ich da falsch gemacht hab, bin wohl mit den Methoden durcheinander gekommen oder sowas. 😳
 
andre ne hab das [highlight]noch nicht gelesen[/highlight], fand bisher "Schriftarten" nich sooo bombig interessant ;
Dachte auch nich, dass die Insel da n eigenes Kapitel für hat... Werd ich nachholen, nochmal danke
shok
Nicht böse sein hdi,
aber hast du etwa noch nicht die Java Insel gelesen
lol
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben