Takaisin luentomateriaaliin

Fonttien käyttäminen

Kun JLabelin tai JButtonin teksti esitetään käyttöliittymässä käytetään fonttina javan oletusfonttia. Fontin voi vaihtaa ainankin edellisille kahdelle komponentille setFont-metodilla (javan api:sta voi etsiä haluamaansa komponenttiin liittyvät metodit). Lisäksi Graphics-oliolle voi asettaa myös fontin.

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.

Fontin valinta

Fonttia asetettaessa ongelma on, että fontin nimi ja erityisesti sen oikea kirjoitusasu on usein hankala arvata. Lisäksi eri käyttöjärjestelmissä esiintyy erilaisia fontteja ja joskus niillä on jopa eri nimet vaikka fontti olisi sama. Fontin voi toki lähettää ohjelman mukana, mutta ainaskin sen kerran kun olen itse tätä kokeillut ääkköset eivät kuuluneet pakettiin ja tämä voi jossain määrin aiheuttaa ongelmia.

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";
        
    }
}

Kirjoitettavan tekstin mitat

Satunnaisesti kun itse piirtelee Graphics-olion avulla muotoja ja tekstejä käyttöliittymään voi olla tarpeellista tietää kirjoitettavan tekstin leveys tai korkeus. Näin ainaskin jos haluaa rajoittaa käyttäjän antaman tekstin pituutta käyttöliittymän mittojen mukaan eikä vain merkkimäärän perusteella, tai jos haluaa keskittää tekstin johonkin tilaan. Tähän tarkoitukseen on olio FontMetrics. Seuraavana lyhyt esimerkki tästä.

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ä.

Takaisin luentomateriaaliin


Viimeksi muokattu 26.9.2012