Takaisin luentomateriaaliin

Grafiikka, värit ja omien komponenttien luonti

Värit

Väriä asetettaessa on tärkeintä, että väri asetetaan ennen kuin komponentti piirretään (Graphics olion yhteydessä), jo piirretyn komponentin väriä ei voi säätää. Tyypillisimmät värit saa helposti Color-luokan staattisista kentistä. Näitä on mm. BLACK, BLUE, RED, LIGHT_GRAY, ...

import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JFrame;

public class Esimerkki {

    private JFrame kehys;

    private void varikkaanEtiketinLisays() {

      JLabel etiketti = new JLabel();
      etiketti.setForeground(Color.RED);
      kehys.add(etiketti);

    }
}

Staattisten kenttien värivalikoima on kuitenkin varsin pieni ja omaa sävyä voi etsiä joko brighter ja darker -metodeilla tai oman värin voi määrittää itse.

Täysin oman värin voi säätää punaisen, vihreän ja sinisen värin määrän mukaisesti. Haluamansa punaisen vihreän ja sinisen värin määrää voi arvioida jos kokeilee olemassa olevan värin osien määriä getRed, getGreen ja getBlue -metodeilla tai vaihtoehtoisesti voi etsiä sovelluksen, jossa värien määrää voi muunnella. Esimerkiksi Macissä Seashore-piirrustusohjelmassa väriä valitessa näkee RGB-määrät.

Color-luokan konstruktori sallii myös läpinäkyvyyden määrittämisen.

import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JFrame;

public class Esimerkki {

    private JFrame kehys;

    private void varikkaanEtiketinLisays() {

      JLabel etiketti = new JLabel();
      Color vari = Color.RED;
      etiketti.setForeground(vari.darker().darker());
      kehys.add(etiketti);

      JLabel omaEtiketti = new JLabel();
      Color omaVari = new Color(0, 128, 128);
      omaEtiketti.setForeground(omaVari);
      kehys.add(omaEtiketti);


    }
}

Grafiikka

Kun Graphics-olion saa käsiinsä voi sillä piirrellä erilaisia muotoja ja tekstejä ikkunaan. Graphics olion tuntemat muodot voi löytää javan apista. Pääidea metodien nimissä on, että fill piirtää kuvion, joka on kauttaaltaan väritetty sillä hetkellä valittuna olevalla värillä, kun taas draw piirtää kuvioille tällä värillä vain reunat.

Graphics-olion saa käsiinsä esimerkiksi määritellessään uudelleen komponenttien piirtotavan, mutta tästä enemmän hetken kuluttua.

Toinen tapa miten Graphics oliolla pääsee piirtämään on jos ikkunaa luodessa ei käytä komponentteja vaan piirtää kaiken suoraan ikkunaan. Suositellumpi tapa on käyttää komponentteja ja omasta kokemuksesta voin sanoa, että komponenttien kanssa koodista tulee paljon siistimpi ja laajennettavampi/päivitettävämpi. Tässä kuitenkin esimerkki Graphics-olion käytöstä:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Esimerkki extends JFrame {

    public Esimerkki() {
      this.setTitle("Esimerkki");
      this.setPreferredSize(250, 600);
      this.getContentPane().setBackground(Color.BLACK);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);

      this.repaint();

    }

    public void paint(Graphics g) {

      g.setColor(Color.BLUE.darker());
      g.fillOval(40, 200, 170, 170);
      g.setColor(Color.BLACK);
      g.drawOval(40, 200, 170, 170);

      g.setColor(Color.WHITE);
      g.drawString("Otsikko", 60, 50);

    }
}

Idea siis on, että ikkunan kuva saadaan päivittymään repaint-metodilla ja tällöin kutsutaan paint-metodia.

Itse koodissa olen piirtänyt ensin sinisen väritetyn ympyrän ja sitten piirtänyt mustat reunat sille. Tämän jälkeen on vielä valkoisella piirretty sivun ylälaitaan teksti "Otsikko".

Useimmat Graphics olion muodoista ovat hyvin yksinkertaisia. Hieman monimutkaisempia kuvioita voi piirtää draw/fillPolygon-metodeilla, joilla voi piirtää monikulmioita. Tällöin kulmien koordinaatit annetaan kahtena listana, x- ja y-koordinaatit erikseen.

Kuvista lisää täällä.

Omien komponenttien luominen

Omia komponentteja kuten JButton tai JLabel voi luoda varsin helposti kun ei kirjoita kaikkia komponenttiin liittyviä metodeja itse vaan asettaa oman luokan perimään jo valmiiksi toteutetut metodit. Tämän jälkeen omanlaisen komponenttinsa saa kun toteuttaa luokalle uusia metodeja tai kirjoittaa perittyjä metodeja uusiksi (override).

Seuraavana esimerkki, jossa luodaan JLabelin kaltainen komponentti jonka teksti on aina oletuksena tumman harmaa ja teksti on ympäröity mustalla kehyksellä.

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JLabel;

public class Etiketti extends JLabel {

    public Etiketti(String teksti) {
      super(teksti);

      this.setForeground(Color.DARK_GRAY);

    }

    @Override
    public void paintComponent(Graphics g) {

      super.paintComponent(g);

      g.setColor(Color.BLACK);
      g.drawRect(0, 0, this.getWidth()-1, this.getHeight()-1);

    }
}

Kuten esimerkistä näkyy, Etiketti perii JLabelin. Tämän lisäksi JLabelin konstruktoria kutsutaan Etiketin konstruktorissa. Konstruktorissa jo määritetään yksi Etiketin poikkeavuus JLabelista eli teksti tulee automaattisesti aina tumman harmaaksi. Toinen poikkeavuus tehdään paintComponent-metodissa, koska JLabeliin ei alun perin liity mitään kehystä. (paintComponent-metodissa määritetään siis miten komponentti piirretään aina kun ikkunaa päivitetään.)

paintComponent-metodissa kutsutaan ensin JLabelin paintComponent-metodia, koska tekstin piirtäminen itse JLabeliin olisi turhaa ja joissain tapauksissa työlästäkin. Yläluokan metodia ei ole toki mikään pakko kutsua jos haluaa toteuttaa piirron kokonaan itse. JLabelin piirrettyä itsensä piirretään vielä mustalla suorakulmio JLabelia ympäröimään. leveydestä ja korkeudesta on vähennetty yksi, koska niitä osia piirroksesta, jotka yltävät komponentin rajojen ulkopuolelle ei piirretä.

Takaisin luentomateriaaliin


Viimeksi muokattu 1.7.2012