A példaprogramok nagy része ugyanarra a sémára épül, nevezetesen a színtér-gráf felépítésére. Mivel ezt minden esetben el kell végezni, a példaprogramok elsô látásra nagynak tűnnek. A programok a CD-rôl is futtathatóak.
Az "antialiasing" változó értékének megfelelôen a rajzolásnál ki/bekapcsolja
az antialiasing használatát, kirajzolásnál pedig a minél gyorsabb megjelenítést
preferálja.
if (antialiasing == true) beallitasok = new RenderingHints (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); else beallitasok = new RenderingHints (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); beallitasok.put (RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2.setRenderingHints (beallitasok);A teljes program: RajzolasMinosege.java |
Kétegységnyi szélességű, legömbölyített V betű kirajzolása, amely a
"mintaKell" változó értékétôl függôen szaggatott vagy nem-szaggatott.
float minta[] = {8.0f}; BasicStroke bs; if (mintaKell == true) bs = new BasicStroke (5.0f, endcapStyle, joinStyle, 10.0f, minta, 0.0f); else bs = new BasicStroke (5.0f, endcapStyle, joinStyle); g2.setStroke (bs); g2.setColor (Color.blue); GeneralPath vBetu = new GeneralPath (); vBetu.append (new Line2D.Float (10.0f, 10.0f, 100.0f, 200.0f), true); vBetu.append (new Line2D.Float (100.0f, 200.0f, 190.0f, 10.0f), true); g2.draw (vBetu);A teljes program: Kontur.java |
Egy téglalap piros-fehér színátmenettel való kitöltése.
GradientPaint gp = new GradientPaint (10.0f, 10.0f, Color.red, 50.0f, 200.0f, Color.white); g2.setPaint (gp); g2.fillRect (10, 10, 150, 200);A teljes program: Szinatmenet.java |
Egy téglalap fehér alapon piros pöttyökkel való kitöltése.
// elôször egy 4x4-es képet készítünk, amely fehér alapon egy piros // pöttyöt tartalmaz BufferedImage bi = new BufferedImage (4, 4, BufferedImage.TYPE_INT_RGB); Graphics2D gbi = bi.createGraphics(); gbi.setColor (Color.white); gbi.fillRect (0, 0, 4, 4); gbi.setColor (Color.red); gbi.fillOval (0, 0, 4, 4); // a képbôl textúrát készítünk, majd hozzáadjuk a grafikus felülethez Rectangle2D teglalap = new Rectangle2D.Float (0.0f, 0.0f, 4.0f, 4.0f); TexturePaint tp = new TexturePaint (bi, teglalap); g2.setPaint (tp); // a texúrával kitöltünk egy téglalapot g2.fillRect (10, 10, 150, 200);A teljes program: Mintak.java |
Egy piros és egy zöld téglalap kirajzolása az SRC_OVER szabállyal és 50%-os
áttetszôséggel, így az egymásba lógó részeknél a két szín keverékét lehet
látni - erôteljesebb zöld hatással.
AlphaComposite ac = AlphaComposite.getInstance (AlphaComposite.SRC_OVER, 0.5f); g2.setComposite (ac); g2.setColor (Color.red); g2.fillRect (10, 10, 150, 200); g2.setColor (Color.green); g2.fillRect (100, 10, 150, 200);A teljes program: Kombinalas.java |
Elôször egy ellipszisként definiálja a rajzolási területet, majd ezt egy
téglalap segítségével módosítja. Mindkét terület méreteinek demonstrálására
a teljes festôvásznat kiszínezi.
public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; // az ellipszis alakú terület definiálása int w = getSize ().width; int h = getSize ().height; Ellipse2D e = new Ellipse2D.Float (w / 4.0f, h / 4.0f, w / 2.0f, h / 2.0f); g2.setClip (e); // kitöltjük a teljes festôvásznat kék színnel; persze, ebbôl csak az ellipszis // belseje színezôdik ki g2.setColor (Color.blue); g2.fillRect (0, 0, w, h); // egy téglalappal megvágjuk az ellipszist Rectangle2D teglalap = new Rectangle2D.Float (w / 2.0f, h / 2.0f, w / 2.0f, h / 2.0f); g2.clip (teglalap); // kitöltjük a teljes festôvásznat zöld színnel; persze, ebbôl csak az ellipszis // jobb-felsô negyedének belseje színezôdik ki g2.setColor (Color.green); g2.fillRect (0, 0, w, h); }A teljes program: Vagas.java |
Egy téglalapon végrehajtja a "trafo" változónak megfelelô affin transzformációt.
Rectangle2D teglalap = new Rectangle2D.Float (100.0f, 100.0f, 50.0f, 100.0f); g2.setTransform (trafo); g2.setColor (Color.blue); g2.draw (teglalap);A teljes program: Transzformacio.java |
A "type" változó értékétô függôen egy egyszerű elem kirajzolása.
Ellipse2D ellipszis = new Ellipse2D.Float (250.0f, 100.0f, 50.0f, 100.0f); Arc2D koriv = new Arc2D.Float (250.0f, 100.0f, 50.0f, 100.0f, 0.0f, 120.0f, Arc2D.OPEN); Rectangle2D teglalap = new Rectangle2D.Float (250.0f, 100.0f, 50.0f, 100.0f); RoundRectangle2D lekerekitettTeglalap = new RoundRectangle2D.Float (250.0f, 100.0f, 50.0f, 100.0f, 10.0f, 10.0f); Line2D vonal = new Line2D.Float (250.0f, 100.0f, 300.0f, 200.0f); g2.setColor (Color.blue); switch (type) { case 1: g2.draw (ellipszis); break; case 2: g2.draw (koriv); break; case 3: g2.draw (lekerekitettTeglalap); break; case 4: g2.draw (teglalap); break; case 5: g2.draw (vonal); }A teljes program: EgyszeruElemek.java |
Egy másodfokú görbe pontjainak PathIteratorral való lekérdezése.
QuadCurve2D gorbe = new QuadCurve2D.Float (10.0f, 200.0f, 100.0f, 0.0f, 190.0f, 200.0f); PathIterator korvonal = gorbe.getPathIterator (null); FlatteningPathIterator laposKorvonal = new FlatteningPathIterator (korvonal, 0.1); Point2D pontok[] = new Point2D [200]; int i = 0; while (!laposKorvonal.isDone ()) { float[] koordinatak = new float [6]; switch (laposKorvonal.currentSegment (koordinatak)) { case laposKorvonal.SEG_MOVETO: case laposKorvonal.SEG_LINETO: pontok[i] = new Point2D.Float (koordinatak[0], koordinatak[1]); } i++; laposKorvonal.next(); }A teljes program: Iterator.java |
Két kör különbségének kék színnel való kiszínezése.
Ellipse2D kor1 = new Ellipse2D.Float (10.0f, 10.0f, 150.0f, 150.0f); Ellipse2D kor2 = new Ellipse2D.Float (100.0f, 10.0f, 250.0f, 150.0f); Area kulonbseg = new Area (kor1); kulonbseg.subtract (new Area (kor2)); g2.setColor (Color.blue); g2.fill (kulonbseg);A teljes program: CAG.java |
A program egy zöld és egy kék téglalapot jelenít meg. Ha valamelyikre
rákattintunk, akkor a program az adott téglalapot piros kerettel kijelöli.
A program: TalalatVizsgalat.java |
Egy egysoros szöveg piros színnel való megjelenítése.
FontRenderContext frc = g2.getFontRenderContext (); Font betutipus = new Font ("Times New Roman", Font.BOLD, 12); String szoveg = new String ("Ez a szoveg 12 pontos, kover Times New Roman betutipussal van irva."); TextLayout megjelenito = new TextLayout (szoveg, betutipus, frc); g2.setColor (Color.red); megjelenito.draw (g2, 10.0f, 100.0f);A teljes program: EgysorosSzoveg.java |
Egy többsoros szöveg piros színnel való megjelenítése.
String szoveg = new String ("Ez egy nagyon hosszu szoveg, ezert tobb sorban kell megjeleniteni."); AttributedString as = new AttributedString (szoveg); AttributedCharacterIterator aci = as.getIterator (); FontRenderContext frc = g2.getFontRenderContext (); LineBreakMeasurer lbm = new LineBreakMeasurer (aci, frc); Font betutipus = new Font ("Times New Roman", Font.BOLD, 12); TextLayout megjelenito = new TextLayout (szoveg, betutipus, frc); g2.setColor (Color.red); lbm.setPosition (0); float x, y = 0.0f; final float sorSzelesseg = 100.0f; while (true) { megjelenito = lbm.nextLayout (sorSzelesseg); if (megjelenito == null) break; x = 0.0f; if (!megjelenito.isLeftToRight ()) x = sorSzelesseg - megjelenito.getAdvance (); y += megjelenito.getAscent (); megjelenito.draw (g2, x, y); y += megjelenito.getDescent () + megjelenito.getLeading (); }A teljes program: TobbsorosSzoveg.java |
Egy kép elhelyezése egy egysoros szövegben.
Font betutipus = new Font ("Times New Roman", Font.BOLD, 12); AttributedString szoveg = new AttributedString ("Ebbe a szovegbe kell beagyazni a kepet."); ImageGraphicAttribute kepAttributum = new ImageGraphicAttribute (kep, GraphicAttribute.ROMAN_BASELINE); szoveg.addAttribute (TextAttribute.CHAR_REPLACEMENT, kepAttributum, 10, 11); AttributedCharacterIterator iterator = szoveg.getIterator (); FontRenderContext frc = g2.getFontRenderContext (); TextLayout megjelenito = new TextLayout (iterator, frc); g2.setColor (Color.red); megjelenito.draw (g2, 0.0f, 100.0f);A teljes program: Kep.java |
Az erôs és a gyenge kurzor megjelenítése és kezelése.
Shape[] kurzorok = megjelenito.getCaretShapes (szovegIndex); ... g2.setColor (Color.red); ... g2.draw (kurzorok[0]); ... if (kurzorok[1] != null) { g2.setColor (Color.green); g2.translate (0, 100); g2.draw (kurzorok[1]); g2.translate (0, -100); }A teljes program: TalalatKezeles.java |
A szövegkijelölés kezelését bemutató program.
Shape kijeloltTerulet = megjelenito.getLogicalHighlightShape (elsoTalalat, masodikTalalat); ... g2.setColor (Color.red); ... g2.fill (kijeloltTerulet); ... megjelenito.draw (g2, 0, 100);A teljes program: SzovegKijeloles.java |
Egy megjelenítendô szöveg karaktereit egy képpel textúrázza.
FontRenderContext frc = g2.getFontRenderContext (); Font betutipus = new Font ("Times New Roman", Font.BOLD, 72); String szoveg = new String ("Ez egy szoveg !"); TextLayout megjelenito = new TextLayout (szoveg, betutipus, frc); AffineTransform trafo = new AffineTransform (); trafo.setToTranslation (0.0f, 100.0f); Shape korvonal = megjelenito.getOutline (trafo); g2.setColor (Color.red); g2.draw (korvonal); g2.setClip (korvonal); Rectangle r = korvonal.getBounds (); g2.drawImage (kep, r.x, r.y, r.width, r.height, this);A teljes program: TexturazottBetuk.java |
A Times New Roman betűtípusból egy újat készítünk, amely függôleges írásra
használható.
AffineTransform trafo = AffineTransform.getRotateInstance (-Math.PI / 2, 0.0, 0.0); Font betutipus = new Font ("Times New Roman", Font.BOLD, 12); Font ujBetutipus = betutipus.deriveFont (trafo); g2.setFont (ujBetutipus); g2.drawString ("Ez egy fuggoleges szoveg!", 30.0f, 300.0f);A teljes program: UjBetutipus.java |
A CS_GRAY és a CIEXYZ színtartományban definiál egy-egy szürke színt,
amelyeket meg is jelenít.
// CS_GRAY szürke színtartományban definiálunk egy színt ColorSpace szurkeSzintartomany = ColorSpace.getInstance (ColorSpace.CS_GRAY); float[] szurkeErtek = { 0.5f }; Color szurke = new Color (szurkeSzintartomany, szurkeErtek, 1.0f); // ezzel kirajzolunk egy téglalapot g2.setColor (szurke); g2.fillRect (50, 50, 100, 100); // az elôbbi szürke színt átkonvertáljuk a CIEXYZ színtartományba ColorSpace CIEXYZSzintartomany = ColorSpace.getInstance (ColorSpace.CS_CIEXYZ); float[] szurkeErtekCIEXYZ = new float[1]; szurkeErtekCIEXYZ = szurkeSzintartomany.toCIEXYZ (szurkeErtek); szurke = new Color (CIEXYZSzintartomany, szurkeErtekCIEXYZ, 1.0f); // az átkonvertált színnel is kirajzolunk egy téglalapot g2.setColor (szurke); g2.fillRect (50, 200, 100, 100);A teljes program: Szintartomany.java |
A CS_GRAY szürke színtartományban az ICC_Profile-lal definiál egy színt.
try { ICC_Profile szurkeProfile = ICC_Profile.getInstance ("GRAY.pf"); ColorSpace szurkeSzintartomany = new ICC_ColorSpace (szurkeProfile); float[] szurkeErtek = { 0.5f }; Color szurke = new Color (szurkeSzintartomany, szurkeErtek, 1.0f); // ezzel kirajzolunk egy téglalapot g2.setColor (szurke); g2.fillRect (50, 50, 100, 100); } catch (Exception e) { }A teljes program: Profile.java |
A program a virtuális képernyôk használatát mutatja be.
BufferedImage kep; Image betoltottKep; ... public void paint (Graphics g) { Dimension meretek = getSize (); Graphics2D g2 = virtualisKepernyotLetrehoz (meretek.width, meretek.height); virtualisKepernyoreRajzol (g2, meretek.width, meretek.height); g2.dispose (); g.drawImage (kep, 0, 0, this); } public Graphics2D virtualisKepernyotLetrehoz (int w, int h) { Graphics2D g2 = null; if (kep == null || kep.getWidth () != w || kep.getHeight () != h) kep = (BufferedImage) createImage (w, h); g2 = kep.createGraphics (); g2.setBackground (getBackground ()); g2.setRenderingHint (RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2.clearRect (0, 0, w, h); return g2; } public void virtualisKepernyoreRajzol (Graphics2D g2, int w, int h) { g2.drawImage (betoltottKep, 0, 0, this); }A teljes program: VirtualisKepernyo.java |
Egy kép tükrözése - felhasználva a DataBuffer osztály megfelelô metódusait.
// a Raster osztalyon keresztul elerjuk a DataBuffer objektumokat BufferedImage ujKep = new BufferedImage (eredetiKep.getWidth (), eredetiKep.getHeight (), eredetiKep.getType ()); DataBuffer db1 = eredetiKep.getRaster ().getDataBuffer (); DataBuffer db2 = ujKep.getRaster ().getDataBuffer (); // megforditjuk az adat-elemek sorrendjet int j = 0; for (int i = db1.getSize () - 1; i >= 0; --i, j++) db2.setElem (j, db1.getElem (i));A teljes program: KepTukrozes.java |
Egy BufferedImage kép elôállítása, felhasználva a megfelelô DataBuffer,
SampleModel, Raster és ColorModel osztályokat
int [] pixelek = new int[100 * 100]; // létrehozunk egy WritableRaster objektumot, amely // egy PixelInterleavedSampleModel és egy DataBufferByte // objektum épü fel WritableRaster raster = Raster.createWritableRaster( new PixelInterleavedSampleModel (DataBuffer.TYPE_BYTE, 100, 100, 1, 100, new int[] {0}), new DataBufferByte (100 * 100), null); // feltöltjük a pixelek tömböt színértékekkel for (int i = 0; i < 100; i++) for (int j = 0; j < 100; j++) pixelek[i * 100 + j] = i; // a WritableRaster objektumnak átadjuk a pixelek adatait raster.setPixels (0, 0, 100, 100, pixelek); // létrehozzuk azt a ColorModel-t, amely szürke színtartománnyal dolgozik ColorSpace szurkeSzinmodell = ColorSpace.getInstance (ColorSpace.CS_GRAY); ColorModel ccm = new ComponentColorModel (szurkeSzinmodell, new int[] {1}, false, false, 1, DataBuffer.TYPE_BYTE); // létrehozzuk a képet, amely tartalmazza a pixeleinek adatait és // tartalmazza azt, hogy egy színérték valójában milyen színt jelent kep = new BufferedImage (ccm, raster, false, null);A teljes program: KepEloallitas.java |
A program egy képélesítô konvolúciós műveletet hajt végre.
float[] sulyok = {-1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f, -1.0f }; ConvolveOp elesites = new ConvolveOp (new Kernel (3, 3, sulyok)); elesites.filter (eredetiKep, ujKep); // kirajzoljuk az eredeti es az uj kepet g2.drawImage (eredetiKep, 20, 20, this); g2.drawImage (ujKep, 20, 220, null);A teljes program: Elesites.java |
A program a keresési táblázatok egy lehetséges használatát mutatja be.
final byte kuszobErtek = 60; byte[] kuszobSzin = new byte[256]; for (int i = 0; i < 256; i++) if (i > kuszobErtek) kuszobSzin[i] = (byte) 255; else kuszobSzin[i] = (byte) 0; LookupOp kuszoboles = new LookupOp (new ByteLookupTable (0, kuszobSzin), null); kuszoboles.filter (eredetiKep, ujKep); // kirajzoljuk az eredeti es az uj kepet g2.drawImage (eredetiKep, 0, 0, this); g2.drawImage (ujKep, 0, 100, null);A teljes program: Kuszoboles.java |
A program három oldalt nyomtat ki, amelyek mindegyikén csak a sorszám fog
szerepelni. A job-ok vezérlését a main metódus végzi, míg a nyomtatási
képek elkészítését az oldalrajzoló print metódusa.
class EgyszeruDokumentumNyomtato1 implements Printable { Font betutipus = new Font ("Times New Roman", Font.BOLD, 36); public static void main (String[] args) { PrinterJob job = PrinterJob.getPrinterJob (); // egy új job-ot ad job.setPrintable (new EgyszeruDokumentumNyomtato1 ()); try { job.print (); } catch (Exception e) { System.out.println ("Hiba tortent a nyomtatas kozben!"); } } public int print (Graphics g, PageFormat pf, int pageIndex) throws PrinterException { if (pageIndex >= 3) return Printable.NO_SUCH_PAGE; g.setFont (betutipus); g.setColor (Color.black); g.drawString ((pageIndex + 1) + ". oldal", 100, 100); return Printable.PAGE_EXISTS; } }A teljes program: EgyszeruDokumentumNyomtato1.java |
Az 1. változatot úgy egészíti ki, hogy egy Java2D objektumot is megjelenít
(csak a print metódus törzsét adjuk itt meg).
if (pageIndex >= 3) return Printable.NO_SUCH_PAGE; Graphics2D g2 = (Graphics2D) g; g2.setFont (betutipus); g2.setColor (Color.black); g2.drawString ((pageIndex + 1) + ". oldal", 100, 100); BasicStroke bs = new BasicStroke (5.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g2.setStroke (bs); g2.setColor (Color.blue); Rectangle2D teglalap = new Rectangle2D.Float (210.0f, 150.0f, 150.0f, 200.0f); g2.draw (teglalap); return Printable.PAGE_EXISTS;A teljes program: EgyszeruDokumentumNyomtato2.java |
A 6.1. alatti példaprogram 1. változatának módosítása úgy, hogy az alkalmazás
képes legyen összetett dokumentumok nyomtatására.
class OsszetettDokumentumNyomtato implements Printable { Font betutipus = new Font ("Times New Roman", Font.BOLD, 36); public static void main (String[] args) { PrinterJob job = PrinterJob.getPrinterJob (); // egy új job-ot ad Book konyv = new Book (); konyv.append (new OsszetettDokumentumNyomtato (), job.defaultPage (), 3); job.setPageable (konyv); try { job.print (); } catch (Exception e) { System.out.println ("Hiba tortent a nyomtatas kozben!"); } } public int print (Graphics g, PageFormat pf, int pageIndex) throws PrinterException { g.setFont (betutipus); g.setColor (Color.black); g.drawString ((pageIndex + 1) + ". oldal", 100, 100); return Printable.PAGE_EXISTS; } }A teljes program: OsszetettDokumentumNyomtato.java |
A program több oldalrajzoló használatát mutatja be.
class TobbOldalRajzolo { public static void main (String[] args) { PrinterJob job = PrinterJob.getPrinterJob (); // egy új job-ot ad Book konyv = new Book (); konyv.append (new EgyikOldalRajzolo (), job.defaultPage (), 3); konyv.append (new MasikOldalRajzolo (), job.defaultPage (), 3); job.setPageable (konyv); try { job.print (); } catch (Exception e) { System.out.println ("Hiba tortent a nyomtatas kozben!"); } } }A teljes program: TobbOldalRajzolo.java |
A 6.1. alatti példaprogram elsô változatának módosításával a program a nyomtatáshoz
kapcsolódó dialógus ablakok használatát mutatja be.
PrinterJob job = PrinterJob.getPrinterJob (); // egy új job-ot ad PageFormat oldalBeallitasok = job.pageDialog (job.defaultPage ()); job.setPrintable (new DialogusAblakok (), oldalBeallitasok); try { job.print (); } catch (Exception e) { System.out.println ("Hiba tortent a nyomtatas kozben!"); }A teljes program: DialogusAblakok.java |