Toon posts:

[Java] drawString verticaal centreren in een rect?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een klein probleempje met het centreren van een tekst die ik teken met drawString() functie. Ik krijg hem namelijk maar niet goed verticaal gecentreerd. Momenteel gebruik ik de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void paint(Graphics g) {
    int mw=((int)this.getSize().getWidth())/2;
    int mh=((int)this.getSize().getHeight())/2;
    g.setFont(new Font("Dialog", Font.BOLD, 12));
    FontMetrics fm=g.getFontMetrics();
    String text="Click somewhere to abort";
    int strw=fm.stringWidth(text);
    int strh=fm.getHeight();
    g.setColor(Color.red);
    g.fillRect(mw-(strw/2)-10, mh-(strh/2)-10, (strw)+20, (strh)+20);
    g.setColor(Color.gray);
    g.draw3DRect(mw-(strw/2)-10, mh-(strh/2)-10, (strw)+20, (strh)+20, true);
    g.setColor(Color.white);
    g.drawString(text, mw-(strw/2),mh+fm.getDescent());
  }

Dat resulteert in een rood vlakje met witte tekst:

Afbeeldingslocatie: http://img123.exs.cx/img123/3963/abort.gif

Alleen zoals je kunt zien staat de tekst niet helemaal goed. Of is dat misschien gezichtbedrog, ik zit er namelijk al zolang naar te kijken ;)

Weet iemand hoe ik dit kan oplossen?

  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 10:55

NDF82

Doomed Space Marine

Waarom gebruik je geen JLabel??

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


Verwijderd

Als je het plaatje opent in een tekenprogramma en sterk uitvergroot, dan kun je pixels tellen. Als je vervolgens de grootte van het vakje en het font een beetje afwisselt en kijkt wat er gebeurt, dan kun je misschien een verband ontdekken. Tenminste, als je er handig mee bent.

Als je daar niet handig mee bent, dan kun je beter terugvallen op bestaande visualisatiecomponenten in bijvoorbeeld Swing. Een JLabel is prima in staat om dit weer te geven.

Verwijderd

Topicstarter
Ik kan geen jlabel gebruiken omdat ik op een glasspane zit te tekenen, als ik een jlabel zou gebruiken zou ik geen rode achtergrond kunnen krijgen (omdat label.setopaque(true) dan de hele glasspane rood zou maken). Ook zou ik m'n eigen progress animatie willen tekenen. :Y)

Verwijderd

De glasspane zou niet rood moeten worden als de JLabel rood gekleurd wordt. Ik vermoed dat er dan met het positioneren van de JLabel op de glasspane iets niet goed gaat. Welke layoutmanager gebruik je om dit te doen en op welke manier?

  • ZonderZout
  • Registratie: Januari 2003
  • Laatst online: 04-05 02:48
gezichtsbedrog.

Komt door het emboss effect. schaduw boven is heel lichtgrijs / wit en onder donkergrijs / zwart. Lijkt daarom of de letters niet goed staan.

Aldus, naar waarheid ingevuld


Verwijderd

Topicstarter
Het is helaas geen gezichtsbedrog, ik had zoals voorgesteld het plaatje eens in psp geopend en de pixels geteld. De tekst staat een aantal pixels te hoog.

Ik had voor de glasspane jlabel geextend daardoor werd heel de glasspane rood ;) Nu heb ik jpanel geextend en daar een jlabel opgezet. De jpanel is niet opaque en word dus de glasspane. jlabel is opaque en daar kan de achtergrond mooi rood worden.

Alleen weet ik nu nog niet wat ik fout deed bij de orginele code. Heeft iemand enig idee?

Verwijderd

misschien werkt het beter als je

code:
1
g.drawstring(text,mw-strw/2,mh-strh/2)


doet. In ieder geval lijkt mw+fh.getDescent() vrij onlogisch.

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

Je glasspane zou idd niet rood moeten worden met een opaque JLabel. Zorg ervoor dat je de goede layoutmanager gebruikt (GridBagLayout b.v.). Layouts als GridLayout en BorderLayout maken de components wel oppervlakvullend. Die moet je dus niet gebruiken :) .

TheStreme - Share anything with anyone


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 13:38
FontMetrics zou gewoon moeten werken als de berekening ook klopt :P

[ Voor 83% gewijzigd door Kwistnix op 21-11-2004 19:43 ]

Pagina: 1