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
|