mit drawString direkt zeichnen, aber wie das Ende finden?

bubi

Neues Mitglied
Hallo,

Ich bin neu in der Java-Entwicklung bin aber für meine Verhältnisse in kurzer Zeit recht weit gekommen.
Es geht darum via RS232 SMS zu empfangen und auf einem Beamer aufbereitet darzustellen.
Grundlegend funktioniert das ganze. Ich bin jetzt soweit das ich die Grafikausgabe überarbeite und es ein wenig "ausmale".

Ich habe mir für meine SMS die angezeigt werden eine eigene Klasse gemacht die auf JPanel basiert und dir paintComponent überschreibt. Es kann einen Text entgegennehmen und mal eine Sprechblase mit zufälliger Farbe auf das JFrame. Das ganze sieht im Moment wie folgt aus.

Java:
g.setColor(c);
        
        arx[0] = 100;
        arx[1] = 50;
        arx[2] = 60;
        ary[0] = rec_h+1;
        ary[1] = rec_h+50;
        ary[2] = rec_h+1;

        g.fillRoundRect(1,1,rec_w,rec_h,50,50);
        g.fillPolygon(this.arx,this.ary,3);

        g.setFont(font);
        g.setColor(Color.white);
        
        g.drawString(this.text1, 20, 30);
        g.drawString(this.text2, 20, 55);
        g.drawString(this.text3, 20, 80);
        g.drawString(this.text4, 20, 105);
        g.drawString(this.text5, 20, 130);

Das funktioniert auch.
rec_w und rec_h sollen dynamisch abhängig vom Text angepasst werden.
Das ganze(wieviele Zeilen und Spalten) ermittle ich bereits in meiner setText() Methode.

Java:
 public void setText(String text){
        this.col = text.length();

        if(text.length()>60){
            this.text1 = text.substring(0, 60);
            this.text2 = text.substring(61, text.length());
            this.row = 2;
        }else{
            this.text1 = text;
            this.row = 1;
        }

        if(text.length()>120){
            this.text2 = text.substring(61, 120);
            this.text3 = text.substring(121, text.length());
            this.row = 3;
        }
        if(text.length()>180){
            this.text3 = text.substring(121, 180);
            this.text4 = text.substring(181, text.length());
            this.row = 4;
        }
        if(text.length()>240){
            this.text4 = text.substring(181, 240);
            this.text5 = text.substring(241, 255);
            this.row = 5;
        }
        updateBorder();     
    }

und mit updateBorder() aktualisiere ich das ganze.

Java:
    public void updateBorder(){
        this.rec_h = 20+(22*row);
        this.rec_w =200 + (7 * col);
    }

Jetzt habe ich aber das Problem das ich nie die passende Größe erwische, ich vermute mal das liegt an der dynamischen "Breite" eines Zeichens.
Farbe ist hier noch nicht zufällig drinnen.

PS: Wenn wer Tipps hat wie ich das ganze noch weiter optisch aufpeppen kann immer her damit :)

LG
Michael

Gibt es eine Möglichkeit den letzten gezeichneten Pixel von zB drawString(...) zu finden? Das würde mir schon reichen.

Ich häng noch ein Bild an damit man sieht um was es geht :)
 

Anhänge

  • bsp.jpg
    bsp.jpg
    18,4 KB · Aufrufe: 37

eRaaaa

Top Contributor
Vllt hilft dir ja folgendes:

Mit
Code:
SwingUtilities.computeStringWidth(...);
könntest du dir die Weite des Strings berechnen lassen...

Also z.B.
Java:
int width= SwingUtilities.computeStringWidth(g.getFontMetrics(), "hallo"); //hallo = dein sms string

Müsstest dann natürlich nur, da du ja mehrere Zeilen unter Umständen anzeigen möchtest, den Längsten ermitteln wahrscheinlich
 

bubi

Neues Mitglied
Vielen Dank!
Läuft perfekt, genau das was ich gesucht habe!

PS: Die längste Zeile habe ich bereits, das ist zu 100% die erste, da eine Zeile nie länger als 60 Zeichen werden kann, weil ich sie danach splitte!
 

BenLie

Mitglied
Da dieser Eintrag per Google zu finden ist, mal kurz als Info: Für Mehrzeiligen Text kann auch die Klasse LineBreakMeasurer genutzt werden. Dabei muss man allerdings die gewünschte Breite kennen. Jedes TextLayout ist eine Zeile.

Java:
AttributedString as = new AttributedString(this.text);
as.addAttribute(TextAttribute.FONT, new Font(fontName, Font.PLAIN, desSize));
AttributedCharacterIterator aci = as.getIterator();
LineBreakMeasurer lbm = new LineBreakMeasurer(aci, g2d.getFontRenderContext());
while (lbm.getPosition() < aci.getEndIndex()) {
    TextLayout tl = lbm.nextLayout(this.getObjectWidth());
    drawy += tl.getAscent();
    newHeight += tl.getAscent();
    tl.draw(g2d, drawx, drawy);
    drawy += tl.getDescent() + tl.getLeading();
    newHeight += tl.getDescent() + tl.getLeading();
}

In den Beispiel wird auch gleich die Höhe des neuen Textes berechnet (ginge natürlich auch indem man einfach den Start Y-Wert vom Letzen Y-Wert abzieht).

Bei Einzeiligentext kann die Höhe/Breite auch wie folgt ermittelt werden:

Java:
Rectangle2D r = g2d.getFontMetrics().getStringBounds(text, g2d);
r.getHeight(); //Höhe des Textes
r.getWidth(); //Breite des Textes
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S drawString() neue Zeile Java Basics - Anfänger-Themen 4
G drawString/ JLabel updaten Java Basics - Anfänger-Themen 1
D For Schleife und DrawString - Problem Java Basics - Anfänger-Themen 20
P drawString() - Fehler Java Basics - Anfänger-Themen 4
L drawString flimmert beim Überzeichnen Java Basics - Anfänger-Themen 5
A GregorianCalendar -Darstellung mit drawString Java Basics - Anfänger-Themen 3
G g.drawString(str, x, y); Schriftgröße? Java Basics - Anfänger-Themen 2
M Bei drawString() wird nicht gezeichnet Java Basics - Anfänger-Themen 10
H drawString Java Basics - Anfänger-Themen 4
P Graphics2D.drawString: Zahlen rechtsbündig ausrichten? Java Basics - Anfänger-Themen 2
Avalon Request direkt aus Eclipse wie bei Postman Java Basics - Anfänger-Themen 3
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
J GUI wird direkt nach dem erstellen weiß übermalt Java Basics - Anfänger-Themen 3
J Direkt studieren? Oder autodidaktisch lernen? Java Basics - Anfänger-Themen 20
P Zufälliges Wort direkt aus einer Liste ausgeben Java Basics - Anfänger-Themen 9
Z ArrayList direkt feste Größe mitgeben Java Basics - Anfänger-Themen 13
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
A Vererbung Mit Casten direkt auf Sub-Klasse Zugreiffen Java Basics - Anfänger-Themen 6
Q Tastatureingabe direkt nach Eingabe (ohne zwischenzeitliches "Return" o.Ä ) weiterverwenden Java Basics - Anfänger-Themen 1
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
S java tastendrücke direkt abfangen und printen Java Basics - Anfänger-Themen 3
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
G JTable: Werte in Tabelle direkt ansprechen Java Basics - Anfänger-Themen 3
D Direkt Klassen Initalisierung Java Basics - Anfänger-Themen 3
F Variablen Variable durch die direkt auf verschiede Objekte zugegriffen werden kann Java Basics - Anfänger-Themen 5
H Text ausdrucken, den ich entweder direkt in die Kommandozeile schreibe, oder über input redirect übe Java Basics - Anfänger-Themen 2
B Methoden Methode Direkt starten (über Kommandokonsole) Java Basics - Anfänger-Themen 5
P .class Datei direkt starten (optional Java Datei direkt starten) Java Basics - Anfänger-Themen 13
M Imports einzeln oder direkt komplette Pakete .*? Java Basics - Anfänger-Themen 26
T Input/Output Direkt auf Eingabe reagieren Java Basics - Anfänger-Themen 8
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
P int Array direkt einer Funktion übergeben Java Basics - Anfänger-Themen 3
D Access Abfrage - Results direkt als Array erhalten Java Basics - Anfänger-Themen 2
L Postleitzahl direkt nach Eingabe prüfen? Java Basics - Anfänger-Themen 7
D Javacode direkt in Betriebsystemabhängiges binary umwandeln Java Basics - Anfänger-Themen 5
D Ist es eigentlich ungünstig direkt in einem Konstruktor bereits umfangreichen Logikcode auszuführen? Java Basics - Anfänger-Themen 11
H jZable - Zelle direkt überschreiben Java Basics - Anfänger-Themen 3
K Datentypen Globale Variable direkt initialisieren oder im Konstruktor? Java Basics - Anfänger-Themen 13
U Von DB in Formular direkt oder über Objekt? Java Basics - Anfänger-Themen 2
babel Datenbank Daten direkt an die Tabelle übergeben ohne Arrays Java Basics - Anfänger-Themen 9
D strings wie "{{5.0,3.0},{1.0,2.0}}" direkt als dou Java Basics - Anfänger-Themen 6
B ActionListener direkt NACH einem anderen ausführen Java Basics - Anfänger-Themen 4
T Checkbox in jtable: boolean wert direkt setzen - wie? Java Basics - Anfänger-Themen 1
J Array: Jedem Element direkt denselben Wert zuweisen Java Basics - Anfänger-Themen 6
G Jar nicht direkt ausführbar Java Basics - Anfänger-Themen 6
N Bilder direkt in Jar einbinden Java Basics - Anfänger-Themen 7
W Double Werte von eine txt Datei direkt einlesen Java Basics - Anfänger-Themen 4
N Tastatur direkt einlesen (ohne Enter) Java Basics - Anfänger-Themen 3
K Reguläre Ausdrücke - Gefundene Tokens direkt ermitteln Java Basics - Anfänger-Themen 3
G jar direkt ausführen Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5
G Ausführen und Eingabe direkt von der konsole Java Basics - Anfänger-Themen 6
R OutputStream direkt in StringBuffer schreiben lassen Java Basics - Anfänger-Themen 2
Dilandau button direkt in applet hängen (ohne panel) Java Basics - Anfänger-Themen 2
S Klassen dynamisch direkt aus Dateien einbinden Java Basics - Anfänger-Themen 3
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
K 3D Fläche Zeichnen Java Basics - Anfänger-Themen 2
J Bild auf Hintergrundbild zeichnen Java Basics - Anfänger-Themen 5
R Iterativ zeichnen Java Basics - Anfänger-Themen 1
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
KogoroMori21 Mit einer Schleife eine Treppe zeichnen Java Basics - Anfänger-Themen 29
V Speicherzustand zeichnen Java Basics - Anfänger-Themen 0
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
Mosquera f(x)=x² zeichnen Java Basics - Anfänger-Themen 5
J Graphen in Java zeichnen Java Basics - Anfänger-Themen 11
L Anfängerin möchte Linie zeichnen Java Basics - Anfänger-Themen 8
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
S Zeichnen mit Wiederholungen Java Basics - Anfänger-Themen 12
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
P Einen String mittig zeichnen? Java Basics - Anfänger-Themen 1
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
M Ein Bild durch Objekterzeugung zeichnen Java Basics - Anfänger-Themen 5
W Wie kann ich in Java eine Kurve aus Punkten zeichnen? Java Basics - Anfänger-Themen 25
snipesss Linie zeichnen ohne extra Klasse? Java Basics - Anfänger-Themen 3
C Umrisse von Bilddateien mithilfe Polygonen zeichnen Java Basics - Anfänger-Themen 5
G Aus einem Code ein Sequenzdiagramm zeichnen? Java Basics - Anfänger-Themen 1
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
B Java Graphen zeichnen - Brauche Hilfe Java Basics - Anfänger-Themen 9
C Schleifenaufgabe - Molekül zeichnen Java Basics - Anfänger-Themen 6
K Ungenauigkeit beim Zeichnen von Funktionen Java Basics - Anfänger-Themen 6
H Linie zeichnen... Java Basics - Anfänger-Themen 16
N Treppe zeichnen Java Basics - Anfänger-Themen 1
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
P Shape Zeichnen klappt nicht - einlesen der Breite/Höhe schon Java Basics - Anfänger-Themen 1
M in Java zeichnen Java Basics - Anfänger-Themen 2
J JLabel Icon neu zeichnen Java Basics - Anfänger-Themen 2
J Rechteck zeichnen mit Canvas Java Basics - Anfänger-Themen 7
D Zeichnen, Schleifen Java Basics - Anfänger-Themen 7
S Zeichnen , Schleifen Java Basics - Anfänger-Themen 4
S Rechteck zeichnen Java Basics - Anfänger-Themen 2
S Ein Graphics Obejct mehrmals mit denselben Eigenschaften zeichnen lassen?!?!? Java Basics - Anfänger-Themen 4
S Wo beginnt ein Draw String zu zeichnen. Java Basics - Anfänger-Themen 4
S Paint Anwendung: Freihandlinien zeichnen Java Basics - Anfänger-Themen 4
llabusch Layout neu zeichnen lassen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben