1.1. Bahasa Pemrograman Java Java memiliki dua fasilitas untuk pemrograman GUI: AWT dan Swing. Versi awal Java memberikan dukungan grafik yang terbatas. Hanya fitur-fitur grafik minimal yang telah dimasukkan dalam JDK 1.x. Dukungan Antarmuka Grafis (GUI) dan fitur untuk menggambar grafis telah disediakan dalam paket Abstract Window Toolkit (AWT). Komponen GUI dalam AWT sangat berat dimapkan ke dalam komponen native sistem operasi. Disamping sekumpulan fiturnya yang sederhana untuk membuat elemen-elemen GUI, AWT memberikan kemampuan untuk mengatur atribut rendering, seperti menggambar dengan warna dan menggambar grafik sederhana, misalnya garis, persegipanjang, dan oval. Juga ada beberapa dukungan untuk gambar (image). Tetapi, fitur-fitur ini terbatas. Contohnya, tidak ada cara untuk mengatur tebal dari garis yang digambar. Karena keterbatasannya, Java versi awal tidak menyediakan dukungan yang cukup untuk pemrograman grafika komputer modern. Paket Swing adalah desain ulang pemrograman GUI termasuk API dalam platform Java 2. Kebanyakan komponen Swing tidak berat tidak diimplementasikan sebagai komponen asal. Dukungan grafis dalam Java 2 juga lebih ditingkatkan lagi.
Listing 1.1 menunjukkan program GUI Java sederhana menggunakan AWT. import java.awt.*; import java.awt.event.*;
public class AWTDemo extends Frame implements ActionListener{ int x = 100; int y = 100;
public static void main(String[] args) { Frame frame = new AWTDemo(); frame.setSize(640, 480); frame.setVisible(true); }
public AWTDemo() { setTitle("AWT Demo"); // create menu MenuBar mb = new MenuBar(); setMenuBar(mb); Menu menu = new Menu("File");
mb.add(menu); MenuItem mi = new MenuItem("Exit"); mi.addActionListener(this); menu.add(mi); // end program when window is closed WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent ev) { System.exit(0); } }; this.addWindowListener(l); // mouse event handler MouseListener mouseListener = new MouseAdapter() { public void mouseClicked(MouseEvent ev) { x = ev.getX(); y = ev.getY(); repaint(); } }; addMouseListener(mouseListener); }
Ketik kode Java di atas, kemudian compile dan jalankan. Apa yang dihasilkan oleh program tersebut?
Program tersebut adalah sebuah aplkasi GUI menggunakan AWT. Program itu mempunyai sebuah jendela (window)
utama dengan sebuah menu dan sebuah lingkaran. Menunya hanya berisi sebuah item, Exit, yang digunakan untuk menutup jendela (window) ketika dipilih. Penggambaran grafik merespon hasil klik mouse dengan menggambar objek pada lokasi mouse ketika di-klik. Kelas AWTDemo didefinisikan menjadi sebuah subkelas Frame (Bingkai). Kelas tersebut mendefinisikan windows (jendela) program utama. Menu dalam frame (bingkai) dibuat dengan objek dari Kelas MenuBar, Menu, dan MenuItem. Kelas AWTDemo mengimplementasikan interface ActionListener untuk memproses ActionEvent yang dibangkitkan oleh pilihan menu. Method actionPerformed yang didefinisikan dalam interface adalah kendali (handler) untuk kejadian (event). Ketika item menu Exit dipilih, program keluar dengan memanggil method System.exit(0). Dua pengendali kejadian (event handler) lainnya didefinisikan dalam konstruktor kelas AWTDemo. Sebuah WindowListener didefinisikan sebagai sebuah kelas anonim dari WindowAdapter. Kelas ini akan menjalankan method windowClosing untuk menghentikan program ketika menerima kejadian (event) penutupan (closing) untuk jendela (window). Listener lainnya adalah sebuah MouseListener, diturunkan dari kelas MouseAdapter. Methode mouseClicked digunakan untuk menangani kejadian klik-mouse (event mouse-click). Dalam method mouseClicked, lokasi mouse-nya disimpan kedalam variabel x dan y, dan sebuah panggilan terhadap method repaint dibuat untuk penggambaran kembali dan memindahkan objek ke lokasi yang baru. Method paint menggambar sebuah lingkaran beradius 50 dengan method drawOval dalam objek Graphics. Titik tengah lingkaran ditentukan dengan variabel x dan y. Method utama (main method) membuat dan menampilkan sebuah instance AWTDemo. Bingkainya (frame) ditentukan dengan ukuran 640 x 480.
Java 2D Platform Java memberikan sekumpulan API (application programming interface) yang komprehensif. Java API mencakup pekerjaan dan aplikasi yang luas: I/O file, grafika, multimedia, database, jaringan, keamanan, dan sebagainya. Java 2 membawa kemajuan yang signifikan dalam kemampuan grafik dengan memperkenalkan Swing dan API Java 2D dan 3D. API yang didesain dengan baik memberikan dukungan komprehensif untuk grafika komputer. Bersamasama dengan keuntungan unik yang dapat diperoleh dari bahasa pemrograman Java, mereka telah mengkombinasikan Java dengan Java 2D dan 3D; sebuah pilihan yang sangat baik untuk pemrograman grafika dan belajar grafika komputer. Di bawah ini sebuah contoh yang mendemonstrasikan fitur grafika Java 2D. Kode dalam demo ini menggunakan kemampuan Java 2D seperti, transparansi, pewarnaan gradien, transformasi, dan pemilihan jenis huruf yang tidak tersedia dalam Java AWT. Untuk mencoba kemampuan Java 2D di komputer Anda lakukan tahapan-tahapan berikut: 1. 2. 3. 4. Ketika listing kode berikut. Compile listing kode yang sudah Anda ketikkan Jalankan file dari hasil peng-compile-an tersebut. Tampilan apa yang dihasilkan oleh program tersebut?
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*;
public class Demo2D extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Java 2D Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new Demo2D(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }
class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); }
// draw an ellipse Shape ellipse = new Ellipse2D.Double(150, 100, 200, 200); GradientPaint paint = new GradientPaint(100,100, Color.white, 400, 400, Color.gray); g2.setPaint(paint); g2.fill(ellipse);
// draw transparent text Font font = new Font("Serif", Font.BOLD, 120); g2.setFont(font); g2.drawString("Java", 120, 200);
// get outline of text glyph FontRenderContext frc = g2.getFontRenderContext(); GlyphVector gv = font.createGlyphVector(frc, "2D"); Shape glyph = gv.getOutline(150,300);
Nama kelas komponen Swing secara khusus mempunyai awalan J. Kelas Panel2D extends kelas JPanel dan overrides method paintComponent. Parameter Grafik dalam method adalah cast to Graphics2D untuk mengambil manfaat fungsi yang dikembangkan dalam Java 2D. Sebuah lingkaran digambar dengan warna gradien yang merubah warnanya berdasarkan lokasi. Kemudian composite rule diatur untuk mencapai derajat transparansi. Huruf glyph untuk string text 2D diambil dan garis tepinya (outline) digunakan sebagai bentuk geometri. Bentuk string 2D diputar 30 derajat (p/6).
Program Java sering dapat ditulis sebagai applet atau aplikasi. Program di atas sebuah contoh program dual purpose. Kelas Demo2D adalah subkelas dari JApplet dan dapat dijalankan sebagai applet. Tetapi, dalam program ini juga terdapat method utama (main method) sehingga juga dapat dijalankan sebagai aplikasi. Method utama (main method) membuat sebuah instance Jframe dan menambah sebuah instance Demo2D ke bingkai (frame). Hasil dari program aplikasi dan aplet hampir mirip.
Format g2.draw(new Line2D.Double(x1, y1, x2, y2)); g2.draw(new Rectangle2D.Double(x, y, rectwidth, rectheight)); g2.draw(new Ellipse2D.Double(x, y, rectwidth, rectheight)); g2.draw(new Arc2D.Double(x, y, rectwidth, rectheight, 90, 135, Arc2D.OPEN)); g2.draw(new QuadCurve2D.Double(x 1, y1, ctrlx, ctrly, x2, y2));
Contoh g2.drawLine(100,100 ,200,200); g2.draw(new Rectangle2D.Double( 50, 25, 100, 50)); g2.draw(new Ellipse2D.Double(20 0,50,100,50)); g2.draw(new Arc2D.Double(200, 125, 100, 50, 90, 135, Arc2D.OPEN)); g2.draw(new QuadCurve2D.Doubl e(100,250,175,175,30 0,250));
Garis
Line2D
Persegipanjang
Rectangle2D
Ellips
Ellipse2D
Ellipse2D.Double Ellipse2D.Float
Busur
Arc2D
Kurva kuadrat
QuadCurve2D
Kurva kubik
CubicCurve2D
Catatan: Kelas Arc2D mendefinisikan 3 (tiga) tipe busur, ditunjukkan dengan konstanta yang menyertai dalam
kelas ini: OPEN, PIE, dan CHORD. Berikut adalah contoh penerapan kelas geometris dalam sebuah program Java. Listing 2.1 KelasGeometri.java import java.awt.*; import java.awt.event.*; 7
import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class KelasGeometri extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Kelas Geometri"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new KelasGeometri(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new Panel2D(); getContentPane().add(panel); } } class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //gambar garis; g2.drawLine(100,100,200,200); //gambar persegipanjang g2.draw(new Rectangle2D.Double(50, 25, 100, 50)); //gambar elips 8
g2.draw(new Ellipse2D.Double(200,50,100,50)); //gambar busur g2.draw(new Arc2D.Double(200, 125, 100, 50, 90, 135, Arc2D.OPEN)); //gambar kurva kuadrat g2.draw(new QuadCurve2D.Double(100,250,175,175,300,250)); //gambar kurva kubik g2.draw(new CubicCurve2D.Double(50,300,150, 200,200,400,300,300)); } } Latihan: Ketiklah kode program diatas. Kemudian compile dan jalankan. Apa yang dihasilkan oleh program tersebut? Jelaskan! 2.2 GEOMETRI BIDANG KONSTRUKTIF
Satu cara untuk membuat bentuk lebih kompleks adalah dengan mengkombinasikan beberapa bentuk sebelumnya (objek geometri). Cara ini dikenal sebagai geometri area konstruktif (constructive area geometry). Kelas Area didesain untuk menghasilkan geometri area konstruktif. Empat operasi yang didukung adalah: union, interseksi, pertidaksamaan, pertidaksamaan geometris. Operasi ini dilakukan pada wilayah dua bidang, menghasilkan bidang baru. Objek Area dapat dibangun dari semua objek Shape menggunakan konstruktor berikut:: void add(Area a) void intersect(Area a) void subtract(Area a) void exclusiveOr(Area a) Listing berikut menunjukkan sebuah program yang mendemonstrasikan efek dari empat operasi geometri area konstruktif. Dua bentuk dikombinasikan menggunakan empat operasi untuk menghasilkan empat bentuk baru.
Listing 2.2 AddArea.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; public class AddArea extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Constructive Area Geometry");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new AddArea(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new AreaPanel(); getContentPane().add(panel); } } class AreaPanel extends JPanel { public AreaPanel() { setPreferredSize(new Dimension(760, 400)); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; //lingkaran pertama. Shape s1 = new Ellipse2D.Double(0, 0, 100, 100); //lingkaran kedua. Shape s2 = new Ellipse2D.Double(60, 0, 100, 100); //area geometri pertama. Area a1 = new Area(s1); //area geometri kedua. Area a2 = new Area(s2); //geser posisi kedua kedua lingkaran dengan x=20 y=50. g2.translate(20, 50); //penentuan ketebalan dan warna garis. BasicStroke bsThickLine = new BasicStroke(5.0f); g2.setStroke(bsThickLine); g2.setPaint(Color.blue); //gambar lingkaran pertama. g2.draw(s1); //gambar lingkaran kedua. g2.draw(s2); //operasi "add".
10
a2.add(a1); //penentuan warna untuk mengisi hasil operasi "add". g2.setPaint(Color.green); //pewarnaan area hasil operasi "add". g2.fill(a2); } }
Listing 2.3 IntersectArea.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; public class IntersectArea extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Geometri Bidang Konstruktif"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new IntersectArea(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new AreaPanel(); getContentPane().add(panel); } } class AreaPanel extends JPanel { public AreaPanel() { setPreferredSize(new Dimension(760, 400)); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; //lingkaran pertama Shape s1 = new Ellipse2D.Double(0, 0, 100, 100);
11
//lingkaran kedua Shape s2 = new Ellipse2D.Double(60, 0, 100, 100); //area geometri pertama Area a2 = new Area(s2); //pindah posisi kedua kedua lingkaran dengan x=20 y=50 g2.translate(20, 50); //gambar lingkaran pertama g2.draw(s1); //gambar lingkaran kedua g2.draw(s2); //area geometri kedua Area a1 = new Area(s1); //operasi "intersect" a1.intersect(a2); //penentuan ketebalan dan warna garis BasicStroke bsThickLine = new BasicStroke(5.0f); g2.setStroke(bsThickLine); g2.setPaint(Color.blue); //gambar bidang hasil operasi "intersect" g2.draw(a1); //penentuan warna untuk mengisi bidang hasil operasi "intersect". g2.setPaint(Color.green); //pewarnaan bidang hasil operasi "intersect". g2.fill(a1); } }
Listing 2.4 Subtract.Area.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; public class SubtractArea extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Geometri Bidang Konstruktif"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12
JApplet applet = new SubtractArea(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new AreaPanel(); getContentPane().add(panel); } } class AreaPanel extends JPanel { public AreaPanel() { setPreferredSize(new Dimension(760, 400)); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; //lingkaran pertama Shape s1 = new Ellipse2D.Double(0, 0, 100, 100); //lingkaran kedua Shape s2 = new Ellipse2D.Double(60, 0, 100, 100); //area geometri pertama Area a2 = new Area(s2); //pindah posisi kedua kedua lingkaran dengan x=20 y=50 g2.translate(20, 50); //gambar lingkaran pertama g2.draw(s1); //gambar lingkaran kedua g2.draw(s2); //area geometri kedua Area a1 = new Area(s1); //operasi "subtract" a1.subtract(a2); //penentuan ketebalan dan warna garis BasicStroke bsThickLine = new BasicStroke(5.0f); g2.setStroke(bsThickLine); g2.setPaint(Color.blue);
13
//gambar bidang hasil operasi "subtract" g2.draw(a1); //penentuan warna untuk mengisi bidang hasil operasi "subtract". g2.setPaint(Color.green); //pewarnaan bidang hasil operasi "subtract". g2.fill(a1); } }
Listing 2.5 exclusiveOrArea.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; public class ExclusiveOrArea extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Geometri Bidang Konstruktif"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new ExclusiveOrArea(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new AreaPanel(); getContentPane().add(panel); } } class AreaPanel extends JPanel { public AreaPanel() { setPreferredSize(new Dimension(760, 400)); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; //lingkaran pertama
14
Shape s1 = new Ellipse2D.Double(0, 0, 100, 100); //lingkaran kedua Shape s2 = new Ellipse2D.Double(60, 0, 100, 100); //area geometri pertama Area a2 = new Area(s2); //pindah posisi kedua kedua lingkaran dengan x=20 y=50 g2.translate(20, 50); //gambar lingkaran pertama g2.draw(s1); //gambar lingkaran kedua g2.draw(s2); //area geometri kedua Area a1 = new Area(s1); //operasi "exclusiveOr" a1.exclusiveOr(a2); //penentuan ketebalan dan warna garis BasicStroke bsThickLine = new BasicStroke(5.0f); g2.setStroke(bsThickLine); g2.setPaint(Color.blue); //gambar bidang hasil operasi "exclusiveOr" g2.draw(a1); //penentuan warna untuk mengisi bidang hasil operasi "exclusiveOr". g2.setPaint(Color.green); //pewarnaan bidang hasil operasi "exclusiveOr". g2.fill(a1); } } Latihan ketik masing-masing listing program tersebut di atas. Kemudian compile dan jalankan. Catatan: Supaya hanya menampilkan bidang hasil operasi add, intersect, subtract, dan, dan exclusiveOr, hilangkan instruksi (baris program): //gambar lingkaran pertama g2.draw(s1); //gambar lingkaran kedua g2.draw(s2); pada masing-masing listing program.
15
2.1 MENGGAMBAR OBJEK GEOMETRIS SEDERHANA Anda telah belajar bagaimana menggambar bentuk-bentuk geometri yang terdapat dalam paket java.awt.geom. Untuk membuat objek geometri yang lebih kompleks, misalnya poligon, segitiga, atau bintang, Anda bisa menggunakan kelas lain dari paket java.awt.geom, yaitu GenaralPath. GeneralPath dimulai dari titik asal, misalnya (0,0). Untuk membuat objek dengan kelas GeneralPath, panggil dengan new GeneralPath() kemudian tambahkan segmen ke bentuk yang akan dibuat dengan menggunakan method-method berikut: moveTo(float x, float y) Memindahkan titik path sekarang ke titik path yang diinginkan. lineTo(float x, float y) menambahkan segmen garis ke path sekarang quadTo(float x, float y) menambahkan segmen kurva kuadrat ke path sekarang curveTo(float x, float y) menambahkan segmen kurva kubik ke path sekarang closePath() - menutup path.
Contoh berikut menjelaskan bagaimana menggambar sebuah polyline menggunakan GeneralPath:
Listing 2.1 KelasGeneralPath.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class KelasGeneralPath extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Kelas GeneraPath"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new KelasGeneralPath(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { 16
JPanel panel = new Panel2D(); getContentPane().add(panel); } } class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; GeneralPath gp = new GeneralPath(); //Mulai dari sudut depan-bawah mobil. gp.moveTo(60,120); //bagian bodi bawah-depan gp.lineTo(80,120); //roda depan gp.quadTo(90,140,100,120); //bagian bodi bawah-tengah gp.lineTo(160,120); //roda belakang gp.quadTo(170,140,180,120); //bagian bodi bawah-belakang gp.lineTo(200,120); //bagian belakang mobil gp.curveTo(195,100,200,80,160,80); //atap gp.lineTo(110,80); //kaca depan gp.lineTo(90,100); //bagian hidung mobil 17
gp.lineTo(60,100); //bagian depan mobil gp.lineTo(60,120); //menggambar mobil g2.draw(gp); } } Latihan Ketiklah kode program diatas. Kemudian compile dan jalankan. Menurut Anda gambar apa yang dihasilkan oleh program tersebut? Jelaskan!
Tugas Projek Tahap II Lengkapilah program yang sudah Anda buat sebelumnya dengan menu yang digunakan untuk pengaturan garis pada objek geometri yang terpilih untuk ditampilkan. Lihat screenshot berikut:
Gambar 3.1 Menu (objek) persegipanjang dan (tipe garis) putus-putus terpilih
18
Gambar 3.1 Menu (objek) elips dan (tipe garis) tebal terpilih
Keterangan: 1. 2. Tampilan di atas hanya merupakan contoh saja. Dalam tahap II (kedua) program ditambah kemampuan untuk menentukan tipe garis (stroke) yang digunakan
untuk menampilkan objek geometri saja. 3. Silahkan membuat program menurut kreativitas masing-masing, misalnya: Untuk membuat menu tipe garis yang akan ditampilkan bisa diganti menggunakan radioButton. Ditambah TextField yang digunakan untuk menentukan ketebalan garis. 1. 2. Dan lain-lain. Penambahan menu tipe garis diharapkan dapat diselesaikan dalam satu minggu, supaya tidak terbebani
19
Array dash mendefinisikan pola garis putus-putus dengan mengatur panjang segment ON/OF. Dasphase mendefinisikan bentuk titik awal dalam pola garis putus-putus.
Graphics2D mempunyai method berikut untuk menentukan model garis sekarang: void setStroke(Stroke s)
Listing berikut mempertunjukkan efek grafik yang menggambar garis dengan tipe garis (stroke) yang berbeda-beda.
20
Listing 3.1. TestStroke1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class TestStroke1 extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Test Stroke-1"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new TestStroke1(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new Panel2D(); getContentPane().add(panel); } }
class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); }
public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //menggambar sebuah garis dengan ketebalan 3 (piksel) BasicStroke bsGarisTebal = new BasicStroke(3.0f); g2.setStroke(bsGarisTebal); g2.drawLine(30,50,30,250);
21
//offset dimana pola garis putus-putus harus mulai. float dashPhase = 0.0f;
//pola garis putus-putus. dashPattern = new float[10]; dashPattern[0] = 4.0f; dashPattern[1] = 5.0f; dashPattern[2] = 8.0f; dashPattern[3] = 5.0f; dashPattern[4] = 12.0f; dashPattern[5] = 5.0f; dashPattern[6] = 16.0f; dashPattern[7] = 5.0f; dashPattern[8] = 20.0f; dashPattern[9] = 5.0f;
//pendefinisian dari BasicStroke yang akan digunakan. BasicStroke bsBerpola = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,2.0f, dashPattern, dashPhase); g2.setStroke(bsBerpola);
//sebuah pola putus-putus yang sederhana dengan panjang garis(dash) 20 dan //lebar jarak 10. dashPattern = new float[2]; dashPattern[0] = 20; dashPattern[1] = 10; //Pendefinisian BasicStroke yang akan digunakan. BasicStroke bsDashed = new BasicStroke(3.0f,BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,2.0f, dashPattern,dashPhase);
22
g2.setStroke(bsDashed);
//menggambar sebuah garis (vertikal) dengan pola yang telah //didefinisikan sebelumnya. g2.drawLine(120,50,120,250);
//menggambar sebuah garis (diagonal) dengan pola yang //telah didefinisikan sebelumnya. g2.drawLine(150,50,350,250);
//Menggunakan pola garis putus-putus yang sama seperti sebelumnya, //tetapi dengan offset 10 dashPhase = 10.0f; //Pendefinisain BasicStroke yang akan digunakan. BasicStroke bsDashedShifted = new BasicStroke(3.0f,BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,2.0f, dashPattern,dashPhase); //menggambar sebuah garis (vertikal) dengan pola putus-putus yang telah //didefinisikan sebelumnya. g2.setStroke(bsDashedShifted); g2.drawLine(90,50,90,250); } }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Berikut adalah contoh penerapan kelas BasicStroke dalam sebuah program yang digunakan untuk menggambar objek geometri sederhana. 23
Listing 3.2. TestStrokeGeom.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class TestStrokeGeom extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Test Stroke-2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new TestStrokeGeom(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new Panel2D(); getContentPane().add(panel); } }
class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //menggambar sebuah garis dengan ketebalan 3 (piksel) BasicStroke bsGarisTebal = new BasicStroke(3.0f); g2.setStroke(bsGarisTebal); g2.drawLine(30,50,30,250); //array untuk mendiskkripsikan pola garis putus-putus. float[] dashPattern;
24
//offset dimana pola garis putus-putus harus mulai. float dashPhase = 0.0f; //pola garis putus-putus. dashPattern = new float[10]; dashPattern[0] = 4.0f; dashPattern[1] = 5.0f; dashPattern[2] = 8.0f; dashPattern[3] = 5.0f; dashPattern[4] = 12.0f; dashPattern[5] = 5.0f; dashPattern[6] = 16.0f; dashPattern[7] = 5.0f; dashPattern[8] = 20.0f; dashPattern[9] = 5.0f;
//pendefinisian dari BasicStroke yang akan digunakan. BasicStroke bsBerpola = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,2.0f, dashPattern, dashPhase); g2.setStroke(bsBerpola); //Menggambar sebuah garis dengan pola putus-putus yang telah didefinisikan //sebelumnya g2.drawLine(100,100,200,200); //sebuah pola putus-putus yang sederhana dengan panjang garis(dash) 20 dan //lebar jarak antar garis 10. dashPattern = new float[2]; dashPattern[0] = 20; dashPattern[1] = 10; //pendefinisian BasicStroke yang akan digunakan. BasicStroke bsGarisPutusPutus = new BasicStroke(3.0f,BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,2.0f, dashPattern,dashPhase); g2.setStroke(bsGarisPutusPutus); //menggambar persegipanjang dengan pola garis putus-putus yang telah //didefinisikan sebelumnya. g2.draw(new Rectangle2D.Double(50, 25, 100, 50)); //menggambar elips dengan pola garis putus-putus
25
//sama seperti sebelumnya g2.draw(new Ellipse2D.Double(200,50,100,50)); //menggambar busur dengan pola garis putus-putus //sama seperti sebelumnya. g2.draw(new Arc2D.Double(200, 125, 100, 50, 90, 135, Arc2D.OPEN)); //gambar kurva kuadrat dengan pola garis putus-putus //sama seperti sebelumnya. g2.draw(new QuadCurve2D.Double(100,250,175,175,300,250)); //gambar kurva kubik g2.draw(new CubicCurve2D.Double(50,300,150, 200,200,400,300,300)); } }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Listing 3.3 mempertunjukkan efek grafik yang menggambar dengan pengaturan tipe garis (stroke) yang berbeda-beda.
Listing 3.3 TestStroke.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*;
public class TestStroke extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Test Strokes"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new TestStroke();
26
class StrokePanel extends JPanel { public StrokePanel() { setPreferredSize(new Dimension(700, 400)); setBackground(Color.white); }
public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
//mengatur bentuk gabungan dua garis dengan: //tebal = 20 //bentuk akhir garis = CAP_BUTT //bentuk gabungan = JOIN_BEVEL Stroke stroke = new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); g2.setStroke(stroke); g2.translate(50,50); g2.draw(path);
27
//mengatur bentuk gabungan dua garis dengan: //tebal = 20 //bentuk akhir garis = CAP_ROUND //bentuk gabungan = JOIN_MITTER stroke = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); g2.setStroke(stroke); g2.translate(200,0); g2.draw(path); g2.drawString("JOIN_MITER",100,0); g2.drawString("CAP_ROUND", 40, 120);
//mengatur bentuk gabungan dua garis dengan: //tebal = 20 //bentuk akhir garis = CAP_SQUARE //bentuk gabungan = JOIN_ROUND stroke = new BasicStroke(20, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND); g2.setStroke(stroke); g2.translate(200,0); g2.draw(path); g2.drawString("JOIN_ROUND",100,0); g2.drawString("CAP_SQUARE", 40, 120);
//menggambar garis putus-putus //pola garis float[] dashArray = {60,20,20,40}; //bentuk awal float dashPhase = 0; //mengatur model garis dengan: //mengatur bentuk gabungan dua garis dengan: //tebal = 10 //bentuk akhir garis = CAP_BUTT //bentuk gabungan = JOIN_BEVEL
28
stroke = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashArray, dashPhase); g2.setStroke(stroke); g2.translate(-400,200); g2.drawLine(100, 50, 550, 50); g2.drawString("dash=60 20 20 40", 250, 10); g2.drawString("phase=0", 0, 50); dashPhase = 20;
//mengatur model garis dengan: //mengatur bentuk gabungan dua garis dengan: //tebal = 10 //bentuk akhir garis = CAP_BUTT //bentuk gabungan = JOIN_BEVEL stroke = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashArray, dashPhase); g2.setStroke(stroke); g2.translate(0,50); g2.drawLine(100, 50, 550, 50); g2.drawString("phase=20", 0, 50); } }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
29
Tugas Projek Tahap II Lengkapilah program yang sudah Anda buat sebelumnya dengan menu yang digunakan untuk pengaturan garis pada objek geometri yang terpilih untuk ditampilkan. Lihat screenshot berikut:
Gambar 3.1 Menu (objek) persegipanjang dan (tipe garis) putus-putus terpilih
30
Gambar 3.1 Menu (objek) elips dan (tipe garis) tebal terpilih
Keterangan: 1. 2. Tampilan di atas hanya merupakan contoh saja. Dalam tahap II (kedua) program ditambah kemampuan untuk menentukan tipe garis (stroke) yang digunakan
untuk menampilkan objek geometri saja. 3. Silahkan membuat program menurut kreativitas masing-masing, misalnya: Untuk membuat menu tipe garis yang akan ditampilkan bisa diganti menggunakan radioButton. Ditambah TextField yang digunakan untuk menentukan ketebalan garis. 1. 2. Dan lain-lain. Penambahan menu tipe garis diharapkan dapat diselesaikan dalam satu minggu, supaya tidak terbebani
31
BAB 4 PEWARNAAN
Anda telah mempelajari bagaimana membuat objek geometri sederhana dan bentuk-bentuk kompleks lainnya serta cara menentukan tipe-tipe garis (stroke) pada grafik. Dalam modul berikutnya akan dibahas tentang cara menambahkan beberapa warna. Materi yang dipelajari meliputi pengisian warna (filling) yang diterapkan dalam pembuatan objek geometri.
4.1 WARNA Ketika objek geometri dibangun, objek tersebut dapat digambar dengan method fill(Shape) atau draw(Shape) dalam Graphics2D. Untuk menentukan warna yang diganakan untuk menggambar objek, method dari kelas Graphics berikut bisa digunakan:
void setColor(Color c)
Objek Color mendefinisikan sebuah warna. Kelas Color secara default menggunakan rentang warna RGB, sebagai rentang warna standard. Warna yang terdiri dari Merah (Red), Hijau(Green), Biru(Blue) dan komponen Alfa (Alpha). Komponen alpha mendefinisikan tingkat transparansi warna tersebut. Kelas Color mendefinisikan nilai warna konstanta(constant) berikut::
32
black blue cyan darkGray gray green lightGray magenta orange pink red white yellow
Nama tersebut tidak mengikuti konvensi(convention) penamaan Java, yang mengatur bahwa konstanta harus dalam huruf kapital. Sejak JDK 1.4, Anda bisa juga menggunakan konstanta baru: BLACK, BLUE, CYAN,
DARK_GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, and YELLOW.
Warna lain dengan mudah dapat dibangun menggunakan satu dari banyak konstruktor kelas Color. Anda bisa langsung menentukan(specify) nilai RGB menggunakan konstruktor berikut:
Color(int r, int g, int b); Color(int rgb); Color(float r, float g, float b);
Versi pertama untuk menentukan ketiga komponen warna menggunakan nilai int dengan rentang 0-255. Versi kedua mirip dengan yang pertama, tetapi ketiga nilainya dijadikan di-paket-kan dalam satu nilai int. Versi ketiga menggunakan nilai float di rentang 0.0 1.0 untuk mendefinisikan komponen warnanya. Konstruktor lain dari kelas Color mengijikan spesifikasi ruang warna.
Berikut adalah potongan program untuk menggambar tiga bujursangkar dengan warna berbeda:
33
g.setColor(Color.red); g.draw(new Rectangle(0, 0, 100, 100)); g.setColor(new Color(0, 255, 128)); g.draw(new Rectangle(100, 0, 100, 100)); g.setColor(new Color(0.5f, 0.0f, 1.0f)); g.draw(new Rectangle(200, 0, 100, 100)); }
Berikut listing lengkap dari program di atas. Listing tersebut menunjukkan sebuah program yang mendemonstrasikan gambar sebuah objek geometris dengan warna garis yang berbeda-beda.
Listing 4.1 TestStrokeGeom.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class TestStrokeGeom extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Test Stroke-2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new TestStrokeGeom(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); } public void init() { JPanel panel = new Panel2D(); getContentPane().add(panel); } } class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white);
34
} public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setColor(Color.red); g2.draw(new Rectangle(0, 0, 100, 100)); g2.setColor(new Color(0, 255, 128)); g2.draw(new Rectangle(100, 0, 100, 100)); g2.setColor(new Color(0.5f, 0.0f, 1.0f)); g2.draw(new Rectangle(200, 0, 100, 100)); } }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Berikut listing lengkap dari program yang mendemonstrasikan gambar sebuah objek geometris dengan warna garis yang berbeda dengan warna area bidang-nya.
Listing 4.1 SegiPanjangWarna.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*;
public class SegiPanjangWarna extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Persegi Panjang Warna");
35
class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); }
Graphics2D g2 = (Graphics2D)g;
//gambar persegipanjang. Rectangle2D.Double persegipanjang = new Rectangle2D.Double(300,100,100,50); g2.setColor(Color.GREEN); g2.fill(persegipanjang); g2.setColor(Color.blue); g2.setStroke(new BasicStroke(3.0f)); g2.draw(persegipanjang); } } Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! compile dan jalankan. Apa yang dihasilkan oleh program
36
4.1 KELAS GradientPaint Kelas GradientPaint mendefinsikan jenis warna dengan warna yang bermacam-macam. Warna gradien ditetapkan oleh dua poin dan dua warna. Ketika lokasi warna berpindah dari poin pertama ke poin kedua, warna berubah secara berangsur-angsur pula dari warna yang pertama ke yang warna yang kedua. Warna gradien dapat siklis (cyclic) atau tidak siklis (acyclic). Warna gradien siklis berulang dengan pola yang sama secara periodik. Untuk membuat warna gradien tidak siklis (acyclic), konstruktor berikut dapat digunakan: GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2); Untuk membuat warna gradien siklis (cyclic), dapat digunakan konstruktor berikut: GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2, boolean);
Berikut adalah contoh penerapan kelas GradientPaint dalam sebuah program Java.
Listing 4.2 SegipanjangWarnaGradient.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*;
public class SegiPanjangWarnaGradient extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Persegipanjang warna-gradien"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new SegiPanjangWarnaGradient(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }
37
class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); }
Graphics2D g2 = (Graphics2D)g;
//gambar persegipanjang. Rectangle2D.Double persegipanjang = new Rectangle2D.Double(300,100,100,50); //membuat warna gradien tidak siklis (acyclic). GradientPaint warnaGradien = new GradientPaint(300, 50, Color.green, 350, 50, Color.yellow); g2.setPaint(warnaGradien); g2.fill(persegipanjang); g2.setColor(Color.blue); g2.setStroke(new BasicStroke(3.0f)); g2.draw(persegipanjang);
//gambar persegipanjang. Rectangle2D.Double persegipanjang2 = new Rectangle2D.Double(100,200, 200,50); //membuat warna gradien siklis (cyclic). GradientPaint warnaGradien2 = new GradientPaint(125,100,Color.green, 150,100,Color.yellow,true); g2.setPaint(warnaGradien2); g2.fill(persegipanjang2);
38
} }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Berikut contoh penerapan kelas GradientPaint lainnya dalam sebuah program Java.
public class SegiPanjangWarnaGradient1 extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Outline Gradien"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new SegiPanjangWarnaGradient1(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true);
39
} public void init() { JPanel panel = new Panel2D(); getContentPane().add(panel); } } class Panel2D extends JPanel{ public Panel2D() { setPreferredSize(new Dimension(500, 400)); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //gambar persegipanjang. Rectangle2D.Double persegipanjang2 = new Rectangle2D.Double(100,200, 200,50); //membuat warna gradien asiklis (acyclic). GradientPaint warnaGradien2 = new GradientPaint(125,100,Color.blue, 175,100,Color.darkGray,false); g2.setStroke(new BasicStroke(10.0f)); g2.setPaint(warnaGradien2); g2.draw(persegipanjang2); } }
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Tugas Projek
40
Tahap III Lengkapilah program yang sudah Anda buat sebelumnya dengan menu yang digunakan untuk pengaturan warna garis pada objek geometri yang terpilih untuk ditampilkan. Lihat screenshot berikut:
Gambar 3.1 Menu (objek) persegipanjang, (tipe garis) tebal, gradien (warna) terpilih
Gambar 3.1 Menu (objek) lingkaran, (tipe garis) tebal, solid (warna) terpilih
Keterangan:
41
1. 2.
Tampilan di atas hanya merupakan contoh saja. Dalam tahap III (ketiga) program ditambah kemampuan untuk pewarnaan yang digunakan untuk
menampilkan objek geometri saja. 3. Silahkan membuat program menurut kreativitas masing-masing, misalnya: Ditambah menu pilihan warna menggunakan radioButton. Ditambah TextField yang digunakan untuk menentukan ketebalan garis. Dll 1. Penambahan menu warna diharapkan dapat diselesaikan dalam satu minggu, supaya tidak terbebani pada untuk menentukan warna (merah, kuning, hijau, dll)
Nama parameter menentukan nama font atau nama font yang logis. Sebuah font diidentifikasi dengan nama font (juga disebut dengan nama font), seperti "Times New Roman." Font yang tersedia di lingkungan tergantung pada platform. Java juga mendukung font logis untuk meningkatkan portabilitas. Sebuah font logis dipetakan ke font fisik pada sistem tertentu. Misalnya, font logis "SansSerif" dipetakan ke "Arial" di sistem Windows. Lima keluarga font logis yang selalu didukung di Jawa.
42
Parameter style adalah digunakan untuk memilih bentuk font. Tiga bit didefinisikan dalam huruf, dan mereka dapat dikombinasikan dengan bitwise ATAU "|" operator:
Parameter ukuran digunakan untuk menentukan poin ukuran font. Objek Font dapat dipilih dalam objek Graphics2D dengan method:
Font akan menyebabkan efek panggilan subsequent ke method selanjutnya untuk membentuk teks: Void drawString(String s, int x, int y) void drawString(String s, float x, float y)
Selain menerapkan font yang ada di sistem, juga memungkinkan untuk mendapatkan font baru dari font yang sudah ada dengan memodifikasi atribut tertentu. Berikut metode di kelas Font untuk menghasilkan font turunan:
Font deriveFont(int style) Font deriveFont(float size) Font deriveFont(int style, float size) Font deriveFont(AffineTransform tx) Font deriveFont(int style, AffineTransform tx) Font deriveFont(Map attributes)
43
import javax.swing.*; import java.awt.geom.*; import java.awt.font.*; public class FontFun1 extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Fonts"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new FontFun1(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }
class FontPanel extends JPanel { public FontPanel() { setPreferredSize(new Dimension(640, 480)); setBackground(Color.white); }
public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //menentukan nama, bentuk, dan ukuran font Font font = new Font("Serif", Font.BOLD, 75); //transformasi affine AffineTransform tx = new AffineTransform(); tx.shear(0.5, 0); //font turunan hasil modifikasi dengan //transformasi affine
44
g2.setFont(font.deriveFont(tx)); g2.drawString("UIN Malang", 50, 125); } } Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Java 2D juga menyediakan fungsi-fungsi lanjutan yang berhubungan dengan operasi font. Secara khusus, glyphs karakter dalam font dapat diambil sebagai objek Shape.
GlyphVector createGlyphVector (FontRenderContext frc, String str) FontRenderContext obyek yang mendefinisikan ukuran tertentu yang diperlukan untuk merender font. Hal tersebut dapat diperoleh dari objek shape Graphics2D oleh memanggil metode getFontRender-Context. Setelah objek GlyphVector dibuat, maka obyek Shape sesuai dengan glyphs dapat diperoleh dengan metode GlyphVector berikut:
Parameneter x and y menentukan lokasi untuk rendering yang glyphs. Listing berikut mendemonstrasikan teknik glyph
Listing 5.2 FontFun2.java import java.awt.*; import javax.swing.*; import java.awt.geom.*; import java.awt.font.*;
public class FontFun2 extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame();
45
frame.setTitle("Fonts"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new FontFun2(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }
class FontPanel extends JPanel { public FontPanel() { setPreferredSize(new Dimension(640, 480)); setBackground(Color.white); }
public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; Font font = new Font("Serif", Font.BOLD, 75);
FontRenderContext frc = g2.getFontRenderContext(); GlyphVector gv = font.createGlyphVector(frc, "UIN Malang"); Shape glyph = gv.getOutline(100,100); g2.setStroke(new BasicStroke(3.0f)); g2.rotate(Math.toRadians(45), 100, 100); g2.draw(glyph); g2.setColor(Color.blue); g2.fill(glyph);
} }
46
Latihan: Ketiklah kode program diatas. Kemudian tersebut? Jelaskan! Jawab: ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ ____________________________________________________________________________________ compile dan jalankan. Apa yang dihasilkan oleh program
Listing berikut mendemonstrasikan teknik menampilkan string menggunakan dengan menggunakan modifikasi warna pada stroke (outline) dan pewarnaan pada area srting (huruf) yang ditampilkan: Listing 5.3 FontFun3.java import java.awt.*; import javax.swing.*; import java.awt.geom.*; import java.awt.font.*;
public class FontFun3 extends JApplet { public static void main(String s[]) { JFrame frame = new JFrame(); frame.setTitle("Fonts"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JApplet applet = new FontFun3(); applet.init(); frame.getContentPane().add(applet); frame.pack(); frame.setVisible(true); }
47
public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; //menentukan nama, tipe, ukuran Font font = new Font("Serif", Font.BOLD, 75);
//String yang ditampilkan FontRenderContext frc = g2.getFontRenderContext(); GlyphVector gv = font.createGlyphVector (frc, "UIN Malang"); Shape text = gv.getOutline(100,100); //men-set ketebalan garis outline g2.setStroke(new BasicStroke(5.0f)); //men-set warna garis outline g2.setColor(Color.RED); //putar sebesar 45 derajat g2.rotate(Math.toRadians(45), 100, 100); //menampilkan string g2.draw(text); //menset warna gradien
GradientPaint warnaGradien2 = new GradientPaint (125,100,Color.blue,400,100,Color.green,false); //menset warna dengan warna gradien g2.setPaint(warnaGradien2); //g2.setColor(Color.GREEN); //mengisi string dengan warna gradien g2.fill(text); } } Latihan: Ketiklah kode program diatas. Kemudian compile dan jalankan. Apa yang dihasilkan oleh program
48
Tugas Projek Tahap IV Lengkapilah program yang sudah Anda buat sebelumnya dengan menu yang digunakan untuk menampilkan text. Lihat screenshot berikut:
49
Gambar 3.1 Menu (objek) teks, (tipe garis) tipis, gradien (warna) terpilih
Keterangan: 1. 2. Tampilan di atas hanya merupakan contoh saja. Silahkan membuat program menurut kreativitas masing-masing, misalnya: Ditambah menu pilihan warna menggunakan radioButton. Ditambah TextField yang digunakan untuk menentukan ketebalan garis. Dll 1. Penambahan menu warna diharapkan dapat diselesaikan dalam satu minggu, supaya tidak terbebani pada untuk menentukan warna (merah, kuning, hijau, dll)
BAB 6
Thread
Sebuah thread merupakan sebuah pengontrol aliran program.Cara termudah untuk membuat thread 50
adalah membuat kelas turunan dari java.lang.Thread , yang memiliki semua metode untuk membuat dan menjalankan thread. Metode paling penting adalah run(), yang bisa kita beban-lebihkan untuk melakukan tugas yang kita butuhkan. Atau dengan kata lain run() adalah metode yang akan dijalankan bersamaan dengan thread lain. State dari Thread Sebuah thread memungkinkan untuk memiliki beberapa state: 1. Running Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU. 2. Ready to run Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya. 3. Resumed Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan. 4. Suspended Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja. 5. Blocked Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.
Prioritas Untuk menentukan thread mana yang akan menerima control dari CPU dan akan 51
dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10, dimana semakin tinggi prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. Sebagai contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama. Thread pertama akan diberikan prioritas nomor 5, sedangkan thread yang kedua memiliki prioritas 10. Anggaplah bahwa thread pertama telah berjalan pada saat thread kedua dijalankan. Thread kedua akan menerima control dari CPU dan akan dieksekusi pada saat thread kedua tersebut memiliki prioritas yang lebih tinggi dibandingkan thread yang pada saat itu tengah berjalan.
Class Thread Constructor Thread memiliki delapan constructor. Marilah kita lihat bersama beberapa constructor:
Constants 52
Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Seperti tabel berikut ini :
53
Contoh dari sebuah counter yang sederhana. import javax.swing.*; import java.awt.*; class CountDownGUI extends JFrame { JLabel label; CountDownGUI(String title) { super(title); label = new JLabel("Start count!"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new Panel(), BorderLayout.WEST); getContentPane().add(label); setSize(300,300); setVisible(true); } void startCount() { try { for (int i = 10; i > 0; i--) { Thread.sleep(1000); label.setText(i + ""); } Thread.sleep(1000); 54
label.setText("Count down complete."); Thread.sleep(1000); } catch (InterruptedException ie) { } label.setText(Thread.currentThread().toString()); } public static void main(String args[]) { CountDownGUI cdg = new CountDownGUI("Count down GUI"); cdg.startCount(); } }
55
56
Setelah di run, tampak objek kubus dari arah depan sehingga nampak seperti gamabar 2D. Agar gambar maka pada method BranchGroup diubah seperti berikut ini:
57
Untuk lebih jelasnya maka buat kelas baru dengan nama HelloJava3D_b.java dan ketikkan source code berikut ini:
58
Tampak pada source diatas terdapat pemanggilan kelas TransformGroup, kelas tersebut digunakan untuk menginisialisasi objek yang akan ditransformasikan dan kemudian ditambahkan sebagai subgraph dari objRoot. Kemudian rotasi dilakukan dengan pemanggilan kelas RotationInterpolator. Jalankan dan lihat bagaimana hasilnya. Untuk hasil yang berbeda, coba buat kelas lagi yang serupa dan beri nama HelloJava3D_d.java. Pada method BranchGroup ketikkan source code berikut ini:
59
TUGAS:
Buatlah sebuah objek 3D yang dapat ditransformasikan (rotasi) melalui control mouse.
60