Forrige avsnitt Neste avsnitt Start på kapittel om grafiske brukergrensesnitt

Hvordan velge farge

Farger defineres i java som objekter av klassebibliotekets klasse Color, som ligger i pakken java.awt. Hver farge er satt sammen av tre fargekomponenter: rød, grønn og blå. I tillegg har fargen en såkalt alfa-verdi som bestemmer i hvilken grad fargen er gjennomsiktig. Alle disse fire parametrene kan ha int-verdier fra 0 til 255, eller float-verdier fra 0.0F til 1.0F.

Fargekomponentene må vi bestemme i form av konstruktørparametre når vi oppretter Color-objektene. Rekkefølgen for parametrene er den samme som rekkefølgen fargene er nevnt i ovenfor. Parameterkombinasjonen (0, 0, 0) gir svart farge, mens kombinasjonen (255, 255, 255) gir hvit. Alfa-verdien kan vi angi som en fjerde konstruktørparameter. Dersom vi lar være, vil den få verdi 1.0F, noe som medfører at fargen blir fullstendig ugjennomsiktig. Alfa-verdi lik 0 gir en fullstendig gjennomsiktig farge.

For et gitt Color-objekt kan vi få tak i verdiene til de fire parametrene ved kall på metodene getRed, getGreen, getBlue, getAlpha. Parameterverdiene blir da returnerte i form av int-verdier.

I praksis er det vanskelig å vite hvordan en farge blir ved at vi velger verdier for de fire parametrene direkte. Det er enklere å gå ut fra Color-klassens static-objekter for standardfargene: Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW. (En kan bruke store eller små bokstaver i fargenavnene.) Ut fra et gitt Color-objekt kan vi få en mørkere eller lysere nyanse av samme fargen ved å gjøre kall på henholdsvis objektets metode darker eller brighter. Disse returnerer et nytt Color-objekt som representerer den nye fargen. For å øke effekten med å endre fargenyanse, kan vi gjøre kall på metodene flere ganger etter hverandre.

Sette farge på grafiske komponenter

For grafiske skjermkomponenter (knapper, tekstfelter etc.) kan vi sette bakgrunnsfarge ved kall på komponentens metode setBackground, der vi bruker ønsket Color-objekt som parameter ved kallet. Forgrunnsfarge kan vi sette på tilsvarende måte ved kall på metoden setForeground. Forgrunnsfargen brukes ved utskrift av tekst og figurer på komponenten (for eksempel knappetekst).

Velge farge for utskrift av tekst og grafikk

I JFrame-vinduer (og i appleter) er det mulig å skrive ut tekst, samt tegne ut rette linjer, rektangler, ovaler etc. ved å legge inn passende instruksjoner i vinduets (eller appletens) paint-metode. Bedre er det imidlertid å definere egne tegneflater for dette formål. Hvordan dette gjøres, skal vi se nærmere på seinere. (Se notatet Panel brukt som tegneflate.) I denne omgang skal vi tegne ut grafikken rett på vindusflata. Hensikten er bare å demonstrere hvordan vi kan velge tegnefarge.

paint-metoden har en parameter av type Graphics (definert i pakken java.awt). Det er denne parameteren som brukes for å gjøre kall på de forskjellige metodene for uttegning av grafikk. Dersom vi ikke bestemmer noe annet, vil det bli brukt svart farge på utskriften. Vi har imidlertid mulighet for å sette tegnefarge for paint-metodens Graphics-parameter ved bruk av dens setColor-metode, og vi kan endre fargen så mange ganger vi vil mens paint-metoden blir utført. Når vi har satt en farge, blir denne brukt på utskriften inntil vi setter en annen farge. Uttrykt i pseudo-kode kan derfor en paint-metode se ut som dette:

  public void paint( Graphics g )
  {
    g.setColor( < Color-objekt > );
    < tegne- og/eller skrive-instruksjoner >
    g.setColor( < annet Color-objekt > );
    < nye tegne- og/eller skrive-instruksjoner >
    ...
  }

(Den tidligere nevnte metoden setForeground kan ikke brukes til å skifte forgrunnsfarge under veis.)

Eksempel 1

Vindusklassen Fargevisning.java som er gjengitt nedenfor demonstrerer noen farger og noen konstruktører for Color-klassen. Det blir også vist hvordan det i paint-metoden kan skiftes farge under veis. Det er også vist hvordan alfa-parameteren påvirker gjennomsiktighet for farge. Vi ser blant annet at når fargen er fullstendig gjennomsiktig, så forsvinner hele fargen. Driverklasse for programmet finnes i fila Fargetest.java. Når vi kjører programmet, får vi vist følgende vindu:

For de tre siste fargene skriver programmet først fargens navn med svart skrift. Deretter skiftes det til den fargen rektanglet skal tegnes med, og dette tegnes oppå utskriften av fargenavnet. Vi ser at for rektanglet med farge MAGENTA synes ikke fargenavnet i det hele tatt, fordi fargen har alfa-verdi lik 255 og dermed er fullstendig ugjennomsiktig. Rødfargen som følger etterpå har alfa-verdi 180. Der synes fargenavnet RØD svakt gjennom fargen. Det siste rektanglet har også rød-farge, men den er fullstendig gjennomsiktig siden den har alfa-verdi lik 0. Fargen til rektanglet synes derfor ikke i det hele tatt, vi ser bare bakgrunnsfargen, samt fargenavnet RØD som her synes helt klart og tydelig.

Når det gjelder metoden fillRect for tegning av et rektangel fylt med vedkommende tegnefarge, angir de to første parametrene plasseringen av rektanglets øverste venstre hjørne, målt i antall piksler fra venstre kant og øverste kant i vinduet. De to siste parametrene angir rektanglets bredde og høyde målt i antall piksler. (Tilsvarende metode for å tegne et åpent rektangel, er drawRect.) I metoden drawString for utskrift av tekst, angir første parameter vedkommende tekst, mens de to siste gir plassering av tekstens nederste venstre hjørne i forhold til vinduets øverste venstre hjørne, målt i antall piksler.

 1 import java.awt.*;
 2 import javax.swing.*;
 3
 4 public class Fargevisning extends JFrame
 5 {
 6    public Fargevisning()
 7    {
 8       super( "Bruk av farger" );
 9       setSize( 450, 250 );
10       setVisible( true );
11    }
12
13    // tegner rektangler og skriver ut tekst med bruk av 
14    //forskjellige farger
15    public void paint( Graphics g )
16    {
17       super.paint( g );
18
19       // setter ny tegnefarge ved å bruke heltall som 
20       //konstruktørparametre
21       g.setColor( new Color( 255, 0, 0 ) );
22       g.fillRect( 25, 50, 100, 20 );
23       g.drawString("Aktuelle verdier for RGB: " + g.getColor(),130,65);
24
25       // setter ny tegnefarge ved å bruke float-verdier som parametre
26       g.setColor( new Color( 0.0f, 1.0f, 0.0f ) );
27       g.fillRect( 25, 75, 100, 20 );
28       g.drawString("Aktuelle verdier for RGB: " + g.getColor(),130,90);
29
30       // setter ny tegnefarge ved å bruke et static Color-objekt 
31       //som parameter
32       g.setColor( Color.BLUE );
33       g.fillRect( 25, 100, 100, 20 );
34       g.drawString("Aktuelle verdier for RGB: " + g.getColor(),130,115);
35
36       // henter ut individuelle RGB-verdier
37       g.setColor( Color.BLACK );
38       g.drawString( "MAGENTA", 30, 145 );
39       Color color = Color.MAGENTA;
40       g.setColor( color );
41       g.fillRect( 25, 125, 100, 20 );
42       g.drawString( "RGB-verdier: " + color.getRed() + ", " +
43          color.getGreen() + ", " + color.getBlue(), 130, 140 );
44       g.drawString( "Alfa-verdi: " + color.getAlpha(), 130, 155 );
45
46       // demonstrerer gjennomsiktighet
47       g.setColor( Color.BLACK );
48       g.drawString( "RØD", 30, 180 );
49       color = new Color( 255, 0, 0, 180 );
50       g.setColor( color );
51       g.fillRect( 25, 165, 100, 20 );
52       g.drawString( "RGB-verdier: " + color.getRed() + ", " +
53          color.getGreen() + ", " + color.getBlue(), 130, 180 );
54       g.drawString( "Alfa-verdi: " + color.getAlpha(), 130, 195 );
55
56       g.setColor( Color.BLACK );
57       g.drawString( "RØD", 30, 220 );
58       color = new Color( 255, 0, 0, 0 );
59       g.setColor( color );
60       g.fillRect( 25, 205, 100, 20 );
61       g.setColor( Color.BLACK );
62       g.drawString( "RGB-verdier: " + color.getRed() + ", " +
63          color.getGreen() + ", " + color.getBlue(), 130, 220 );
64       g.drawString( "Alfa-verdi: " + color.getAlpha(), 130, 235 );
65    }
66 }

Velge farge ved hjelp av JColorChooser

I klassebibliotekets javax.swing-pakke finnes klassen JColorChooser. Denne definerer en dialogboks som kan brukes til å velge farge. Fra og med javaversjon 7 er funksjonaliteten til JColorChooser blitt utvidet. Den gir nå bl.a. mulighet til å velge farge på fem forskjellige måter, mens det i tidligere javaversjoner var begrenset til tre måter. De forskjellige måtene å velge farge på kommer fram ved at man i dialogboksen kan velge mellom fem forskjellige fanekort. Valgmulighetene er vist på bildene nedenfor. (Hvilke farger som vises i boksen er avhengig av hvilke innstillinger som er gjort.)

I den første av valgmuligheten blir det vist et rutenett av fargeprøver som man kan velge blant ved å klikke på dem, som vist på følgende bilde:

På neste bilde vises muligheten kalt HSV for å velge farge. HSV står for Hue-Saturation-Value. (Før JDK7 ble denne kalt HSB, for Hue-Saturation-Brightness.)

Så følger muligheten kalt HSL, forkortelse for Hue-Saturation-Lightness. Denne er ny i JDK7.

I alternativet RGB, vist under, velger man farge etter Rød-Grønn-Blå-fargemodellen.

Det siste alternativet, CMYK, er også nytt i JDK7. Med det velger man farge etter den såkalte fire-farge-modellen. Betegnelsen CMYK er et derivat fra de engelske navnene på primærfargene: Cyan, Magenta, Yellow og blacK/Key-color.

I alle de fem tilfellene velges farge ved at man først gjør de innstillingene man ønsker, og deretter klikker på dialogboksens OK-knapp. Boksen vil da lukke seg, og valgt farge blir returnert i form av et Color-objekt. Dersom det blir klikket på Cancel-knappen eller lukkeknappen, vil det bli returnert null. Instruksjonen for å vise en slik dialogboks for valg av farge kan uttrykkes på følgende måte i pseudo-kode:

  Color valgtFarge = JColorChooser.showDialog(
       < foreldervindu >, //referanse til forelder-vinduet
       "Velg en farge",  // tekst som kommer på dialogboksens tittellinje
       startfarge );  // forhåndsvalgt Color-objekt, fåes tilbake ved
                      // klikk på dialogboksens Reset-knapp.

I programmet Fontstiler som står under omtalen av fonter i neste avsnitt blir det brukt en JColorChooser til å velge farge på utskriften.

JColorChooser inneholder også en god del annen funksjonalitet som det er mulig å programmere. En nærmere omtale av dette finnes i omtalen av JColorChooser i The Java Tutorials.

Copyright © Kjetil Grønning og Eva Hadler Vihovde, revidert 2014

Forrige avsnitt Neste avsnitt Start på kapittel om grafiske brukergrensesnitt