/* * KleurCanvas.java 13 maart 2003, Paul Bergervoet * */ package kleurapplet; import java.awt.*; import kleurapplet.grnuminput.*; class KleurCanvas extends Canvas implements NumberListener { // Variables for double buffering Dimension dd; private Image bufferTekening; // Image tbv offline painting private Graphics bufferGraphics; // Graphics object van bufferTekening private Dimension bufferGrootte = new Dimension(0, 0); // Size of Image, check with Frame size // Variables private int roodval; private int groenval; private int blauwval; private float[] hsbvalues; // Constants private static Color echtRood = new Color(255, 0, 0); private static Color echtGroen = new Color(0, 255, 0); private static Color echtBlauw = new Color(0, 0, 255); private static Font displayfont = new Font("SansSerif", Font.PLAIN, 12); // Panels RGBInvoerPaneel rgbip; HSBInvoerPaneel hsbip; public KleurCanvas() { roodval = 127; groenval = 127; blauwval = 127; hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues); setBackground(Color.white); setSize(360, 340); } /** * Vertaalt een RGB-component in een tweecijferige hexamdecimale waarde. */ public String hexValue(int c) { String h = Integer.toHexString(c); if ( h.length() == 1 ) // add zero voor eencijferige string { h = "0".concat(h); } return h; } /** * Tekent naam van de kleurcomponent plus vlakje gekleurd in die component. * bij RGB zetten we klein blokje in volle kleur voor de naam (argument fc) * Bij HSB niet, dan is dat arg null. * * @param naam Naam van de Kleurcomponent (Tint, Verzadiging, .., Rood ...) * @param c De te tekenen Kleurcomponent * @param fc Kleur van het blokje met volle kleur R, G of B. ja/nee * @param x De x-positie * @param y De y-positie * @param g De Graphics-context */ private void paintKleurComponent(String naam, Color c, Color fc, int x, int y, Graphics g) { int schuifx = 0; if ( fc != null ) // blokje echt rood/groen/blauw { g.setColor(fc); g.fillRect(x, y+5, 10, 10); schuifx = 15; // naam zometeen 15 pixels naar rechts } g.setColor(c); g.fillRoundRect(x, y+20, 60, 40, 5, 5); g.setColor(Color.black); g.drawString(naam, x+schuifx, y+15); g.drawRoundRect(x, y+20, 60, 40, 5, 5); } public void paint(Graphics g) { g.setFont(displayfont); Color c; // --- tint ---- c = Color.getHSBColor(hsbvalues[0], 1, 1); // helderheid, verzadiging vol paintKleurComponent("Tint", c, null, 30, 20, g); // --- verzadiging ---- c = Color.getHSBColor(hsbvalues[0], hsbvalues[1], 1); // helderheid vol paintKleurComponent("Verzadiging", c, null, 30, 100, g); // --- helderheid ---- c = Color.getHSBColor(hsbvalues[0], 0, hsbvalues[2]); // verzadiging 0: grijs dus paintKleurComponent("Helderheid", c, null, 30, 180, g); // --- rood ---- c = new Color(roodval, 0, 0); paintKleurComponent("Rood", c, echtRood, 270, 20, g); // --- groen ---- c = new Color(0, groenval, 0); paintKleurComponent("Groen", c, echtGroen, 270, 100, g); // --- blauw ---- c = new Color(0, 0, blauwval); paintKleurComponent("Blauw", c, echtBlauw, 270, 180, g); // --- menging ---- g.setColor(new Color(roodval, groenval, blauwval)); g.fillRoundRect(120, 40, 120, 280, 5, 5); g.setColor(Color.black); g.drawString("De kleur", 120, 35); g.drawRoundRect(120, 40, 120, 280, 5, 5); // --- hexadecimaal RGB --- g.setColor(Color.black); g.drawString("Hex. RGB:", 270, 300); String hrgb = "#"; hrgb = hrgb.concat(hexValue(roodval)); hrgb = hrgb.concat(hexValue(groenval)); hrgb = hrgb.concat(hexValue(blauwval)); g.drawString(hrgb, 270, 315); } // Event handler /** * Bij verandering van RGB moet HSB worden aangepast */ private void adjustHSBValues() { hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues); } /** * Bij verandering van HSB moet RGB worden aangepast */ private void adjustRGBValues() { Color c = Color.getHSBColor(hsbvalues[0], hsbvalues[1], hsbvalues[2]); roodval = c.getRed(); groenval = c.getGreen(); blauwval = c.getBlue(); } public void numberChanged(String naam, double v) { if ( naam.equals("Rood") ) { roodval = (int)v; // harde cast!! v loopt van 0 tot 255 met 0 decimalen! adjustHSBValues(); } else if ( naam.equals("Groen") ) { groenval = (int)v; adjustHSBValues(); } else if ( naam.equals("Blauw") ) { blauwval = (int)v; adjustHSBValues(); } else if ( naam.equals("Tint") ) { hsbvalues[0] = (float)v; // harde cast!! v loopt van 0 tot 1 met 3 decimalen! adjustRGBValues(); } else if ( naam.equals("Verzadiging") ) { hsbvalues[1] = (float)v; adjustRGBValues(); } else // must be "Helderheid" { hsbvalues[2] = (float)v; adjustRGBValues(); } repaint(); } // ----- tbv double buffering public void update(Graphics g) { dd = getSize(); // check eventuele resize... if ( bufferTekening == null || // Image is er nog niet of .. bufferGrootte.width != dd.width || // breedte/lengte van Canvas bufferGrootte.height != dd.height // veranderd: dan nieuwe! ) { bufferTekening = createImage(dd.width, dd.height); bufferGrootte = dd; bufferGraphics = bufferTekening.getGraphics(); } // Teken het nieuwe plaatje... bufferGraphics.setColor(Color.white); // background vullen bufferGraphics.fillRect(0, 0, bufferGrootte.width, bufferGrootte.height); paint(bufferGraphics); // laat paint in Image werken! g.drawImage(bufferTekening, 0, 0, null); // zet Image op Canvas.... } }