JLabelille, JButtonille ja Graphics-oliolle fontti asetetaan samallalailla. Esimerkkinä nyt JLabel:
import java.awt.Font;
import javax.swing.JLabel; public class Esimerkki { private void luoKomponentit() { JLabel etiketti = new JLabel("Fontti"); etiketti.setFont( new Font("arial", Font.PLAIN, 18) ); } } |
Tässä esimerkissä fontiksi asetettiin siis uusi Font-olio. Font-oliota luodessa parametrina annetaan fontin nimi, fontin muotoiluun liittyvä vakio (PLAIN, BOLD, ym.) sekä fontin koko.
Kaikki systeemin tuntemat fontit voi kuitenkin pyytää GraphicsEnvironment-oliolta, jota voidaan kutsua suoraan. Tämän jälkeen annetuista fonteista voi etsiä sopivan. Itse olen usein listannut useita fontteja jos ensisijaista fonttia ei löydetä koneelta.
import java.awt.Font;
import java.awt.GraphicsEnvironment; public class Esimerkki { private String haeFontti() { GraphicsEnvironment ymparisto = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[] fontit = ymparisto.getAllFonts(); String[] halututFontit = {"Herculanum", "ComicSansMS", "Comic Sans MS", "ArialMT", "Arial"}; for (String haluttuFontti : halututFontit) { for (Font fontti : fontit) { if (font.getFontName().equals(haluttuFontti)) { return font.getFontName(); } } } for (Font font : fonts) { if (font.getFontName().toLowerCase().contains("futura")) { return font.getFontName(); } } return "arial"; } } |
import java.awt.Font;
import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.JButton; public class Nappula extends JButton { @Override public void paintComponent(Graphics g) { String nimi = this.getText(); g.setFont(new Font("futura", Font.PLAIN, 16)); int tekstinLeveys = laskeTekstinLeveys(g, nimi); int tekstinKorkeus = laskeTekstinKorkeus(g); int tekstinVaakakeskitys = (this.getWidth() - tekstinLeveys) / 2; int tekstinPystykeskitys = (this.getHeight() - tekstinKorkeus) / 2; g.drawString(nimi, tekstinVaakaKeskitys, tekstinPystykeskitys + tekstinKorkeus); } private int laskeTekstinLeveys(Graphics g, String teksti) { FontMetrics fm = g.getFontMetrics(); return fm.charsWidth(teksti.toCharArray(), 0, teksti.length()); } private int laskeTekstinKorkeus(Graphics g) { FontMetrics fm = g.getFontMetrics(); return fm.getMaxAscent(); } } |
Tekstin piirtäminen eroaa muiden komponenttien sijoittamisessa siinä, että määritetyt x ja y -koordinaatit eivät määritä vasenta yläkulmaa vaan alakulman.
Tekstin leveyttä laskettaessa annetut parametrit ovat merkit taulukossa, indeksi josta halutut merkit alkavat taulukossa ja haluttujen merkkien määrä. Tekstin korkeutta laskettaessa ei toisaalta tarvita mitään tietoa kirjoitettavasta tekstistä, mutta toisaalta käytettävän metodin kohdalla saa olla tarkkana. getMaxAscent antaa tekstin perusviivan ja ylimmän viivan välisen eron (esimerkiksi näiden korkeus: b, d, h), kun taas eri metodeilla kuten getLeading tai getDescent voi saada muita etäisyyksiä.
Viimeksi muokattu 26.9.2012