Çizgilerin kalınlığını Dolguları Temel dönüşüm işlemlerini Bileşik nesne oluşturma işlemlerini kontrol etmemizi sağlar.

Benzer belgeler
Çizgilerin kalınlığını Dolguları Temel dönüşüm işlemlerini Bileşik nesne oluşturma işlemlerini kontrol etmemizi sağlar.

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

APPLET KAVRAMI ve GRAFİKSEL ÇİZİM UYGULAMLARI

Start : Bu method init methodundan hemen sonra çalışır ve applet dosyası yürütülmeye başladığında çalışmaya başlar.

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

COM337 Bilgisayar Grafiği. OpenGL ile Grafik Programlama. Dr. Erkan Bostancı

BİL-141 Bilgisayar Programlama I (Java)

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

Görsel Programlama DERS 07. Görsel Programlama - Ders07/ 1

JavaFX Temelleri (1)

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

CENG 217 Object Oriented Design. Doç. Dr. Halûk Gümüşkaya /

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

Karşılaştırma İşlemleri ve Koşullu İfadeler

MOBİL UYGULAMA GELİŞTİRME

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

İÇİNDEKİLER VII İÇİNDEKİLER

BİLGİSAYAR DESTEKLİ TASARIM (TEKNİK RESİM-II) Yrd. Doç. Dr. Muhammed Arslan OMAR

BOOTLOADER MANUAL DOCUMENT

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Java da İstemci Tarafı Uygulamalar

BİL132 Bilgisayar Programlama II

Yrd. Doç. Dr. Caner ÖZCAN

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

YZM 2105 Nesneye Yönelik Programlama

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Ölçek Kavramı Görünüşler AutoCAD ile çizime hazırlık Komut Anlatımı Komut Satırı Koordinat Girişi (Line)

C++ Dersi: Nesne Tabanlı Programlama

BÖLÜM ÜÇ BOYUTLU NESNELERİ KAPLAMA VE GÖLGELENDİRME

1 - Button Kontrolu Nasıl Yapılır?

Ekran 1 : Font Komutları Dosyası ekranı

MOBİL UYGULAMA GELİŞTİRME

GÖRÜNÜŞLER. Bir nesneyi daha iyi resmedebilmek için Görünüşlerden yararlanılır.

HSancak Nesne Tabanlı Programlama I Ders Notları

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 18: Formatlı Grafik Kullanıcı Arayüzü Oluşturma

Android Ders Notları

BMH-303 Nesneye Yönelik Programlama

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

2 TEMEL ÇİZİM KOMUTLARI

Dr. Fahri Vatansever GRAFİK. 6. Hafta GRAFİK MODU. x x (0,0) (x,y) piksel (pixel) EKRAN. (Xmax,Ymax)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

MOBİL UYGULAMA GELİŞTİRME

Nesneye Yönelik Programlama-JAVA (S flar), Ders sorumlusu Yrd.Doç.Dr.Hilmi KU ÇU

WEB TASARIMININ TEMELLERİ

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

CSS (Stil Şablon) (Cascading Style Sheets) YRD. DOÇ. DR. ENGİN CEMAL MENGÜÇ

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

ECLIPSE PROGRAMININ ÇALIŞTIRILMASI

Sunum İçeriği. Programlamaya Giriş

2 INDESIGN CC DE NELER YENİ?

Burak Kıymaz JAVA FX

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

Skecher (Çizim) Komutları

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

SINIF İÇİ UYGULAMA KODLARI

/*int sayi1, sayi2,toplam=0;

Klavyeden Basit Giriş/Çıkış İşlemleri

1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Spring Framework Eğitimi

Erişim konusunda iki taraf vardır:

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices;

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

Java String İşlemleri

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

DERS 1. (define YAŞ 14) YAŞ = 14. (define BİR-SAYI 0.6) BİR-SAYI = 0.6. (define HIZ -90) HIZ = -90. İki tane de kendiniz yazın: SINIF = Önyükleme

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Java: printf() Metodu İle Çıktıyı Biçemleme

MEKANİZMA TEKNİĞİ (7. Hafta)

Java da İşleçler, Ders #3 (4 Kasım 2009)

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Bilgisayar Grafiğine Giriş Ders Notları

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

JAVADA DİZİ İŞLEMLERİ

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Java dili, aşağıdakiler de dahil olmak üzere çok çeşitli denetleyici türlerine sahiptir.

DİŞLİ ÇARK ÇİZİMİ: 1. Adım Uzunlukları diş üstü dairesi çapından biraz büyük olacak şekilde bir yatay ve bir düşey çizgi çizilir.

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

3.Hafta. . Kontrol Deyimleri/İfadeler

Transkript:

JAVA2D

Java2D API Geniş çaplı 2D geometrik şekillerin çizdirilmesini Birleşik (Composite) nesneleri oluşturmasını Renk yönetimini kolaylaştıracak genişletilmiş renk desteği Kompleks dokümanlar için çıktı özelliklerini sağlar.

Java2D API Java2D API Çizgilerin kalınlığını Dolguları Temel dönüşüm işlemlerini Bileşik nesne oluşturma işlemlerini kontrol etmemizi sağlar. Java2D API resimleri yükleme ve üzerlerinde işlem yapılmasına olanak tanır. AWT ile entegredir.

Koordinat Uzayları Her bir Java 2D nesnesi user space de bulunur ve bu bir koordinat sistemiyle ifade edilir. Çizdirilecek nesneler çizilecek cihazın uzayına taşınır ( Device Space ) Genelde device space de bir unit bir pixel değerine eş değerdir. Fiziksel ekran görüntüsü genelde fiziksel çıktı görünümüyle eş değerdir.

Rasterizer Bir rasterizer çizim pipeline ında; programdaki nesneleri alır ve her bir pixel için gerekli değeri üretir. Gerekli değerden kasıt şekil için her bir pixelin ne kadar etkilendiğidir. Bu değerler alpha değerleri olarak adlandırılır. Alpha değerleri aynı zamanda rengin geçirgenliğini de verecektir. Alpha değeri 0.0 dan 1.0 a kadar olup 0.0 tam geçirgenliği 1.0 ise aksini ifade eder. Bileşik nesneler oluşturulmasında hem alpha değeri hem de renk bilgisi önemli rol oynar.

Java da Painting AWT de boyama işlemleri paint(graphics g) metodu içinde gerçekleştirilir. Bu metod java.awt.canvas sınıfının bir metodudur. Swing de ise bu işlemler java.swing.jcomponent sınıfının bir metodu olan paintcomponent(graphics g) metodu içinde gerçekleştirilir. Graphics2D nesneleri için gerekli tüm işlemler paintcomponent(graphics g) metodu içinde gerçekleştirilmelidir.

Şekillerin Çizimi AWT de şekiller drawxxx veya fillxxx gibi komutlar çalıştırılarak gerçekleştirilirken Java2D de öncelikle nesnenin kendisi oluşturulur daha sonra Graphics2D nesnesinin draw veya fill komutlarına bu nesne parametre olarak geçirilerek kullanılır. AWT public void paint(graphics g) { g.setcolor( ); // Draw a shape g.drawoval(...); } Java2D public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Ellipse2D.Double circle = new Ellipse2D.double( ); g2d.fill(circle);... }

Örnek-1 public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Ellipse2D.Double circle = new Ellipse2D.Double(15, 15, 90, 90); Rectangle2D.Double square = new Rectangle2D.Double(10, 10, 100, 100); } g2d.fill(circle); g2d.draw(square);

Java2D de Renkler Renkler java.awt paketi içinde bulunur. Bir çok constructor a sahiptir; Color(float/int r, float/int g, float/int b) Color(float/int r, float/int g, float/int b, float/int a) Color(int rgb) (Mavi ilk byte, Yeşil 2. ve Kırmızı 3.byte) JFC masaüstünüzle uygun olarak renkleri seçmenizi sağlar. Örneğin arkaplan rengi olarak genel pencere rengini seçmek istiyorsanız aşağıdaki yeterli olacaktır; setbackground(uimanager.getcolor( window )); Diğer bazı sistem rengi anahtar kelimeleri ; desktop, windowtext,menu,text,info, scrollbar,

Örnek-2 public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Ellipse2D.Double circle = new Ellipse2D.Double(15, 15, 90, 90); Rectangle2D.Double square = new Rectangle2D.Double(10, 10, 100, 100); Color c = new Color(11,22,72); setbackground(c); g2d.setcolor(color.red); System.out.println("Called Paint"); g2d.fill(circle); g2d.setcolor(uimanager.getcolor("info")); g2d.draw(square); }

java.awt.geom package içindeki sınıflar Point2D Arc2D Area CubicCurve2D Dimension2D Ellipse2D GeneralPath

Noktalar Bir nokta ile pixel farklı şeylerdir. Point2D abstract bir sınıf olup içsel sınıflar içerir. Point2D.Float, Point2D.Double gibi Bu sınıf ayrıca iki nokta arasındaki uzaklığı bulmak için fonksiyonlar sağlar; public double distance (double PX, double PY) public double distance (Point2D pt)

Şekiller Winding Kuralı Karmaşık bir şekil çizdiniz. Fakat içini nasıl doldurabiliriz? Winding kuralı fill() komutu çalıştırıldığında çizilen şeklin hangi parçasının içsel hangisinin dışsal olduğunu belirler. Çift-Tek kuralı Tüm şekil boyunca hat çizilir. Her yüzey çakışmasında counter bir arttırılır Eğer counter çift ise dışarıda tek ise içeridedir. Non-Zero Kuralı Tüm şekil boyunca hat çizilir. Eğer hat soldan sağa doğru uzanan bir hat ile çalışırsa counter arttırılır aksi halde azaltılır. 0 olmayan bölgeler içeride kabul edilir 1 0 Çift-Tek 7 6 4 5 3 2 Non-zero 0-1 1 0-1 -2

Şekiller GeneralPath Parça parça bir path oluşturmayı sağlar Default olarak non-zero winding kuralını kullanır. Bu sınıfın constructor ları public GeneralPath(int windingrule) public GeneralPath(int windingrule, int InitialCapacity) Metodları moveto(float x, float y) lineto(float x, float y) quadto(float controlx1, float controly1, float endx, float endy) cubicto(float controlx1, float controly1, float controlx2, float controly2, float endx, float endy) append(shape s, boolean connect) closepath()

Örnek 3 public class GeneralPaths2 extends JPanel { private GradientPaint gpaint = new GradientPaint(50, 50, Color.blue, 175, 175, Color.green, true); int x = 10; int y = 10; int rectwidth = 200; int rectheight = 200; int x1points[] = {x, x+rectwidth, x, x+rectwidth}; int y1points[] = {y, y+rectheight, y+rectheight, y}; GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1points.length); public GeneralPaths2() { super(); setlayout(null); polygon.moveto(x1points[0], y1points[0]);.} for (int index = 1; index < x1points.length; index++) polygon.lineto(x1points[index], y1points[index]); polygon.closepath(); } public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setpaint(gpaint); g2d.fill(polygon); }

Çizgiler ve Eğriler Line2D Bir çizgi double,float veya Point2D parametre alabilir. QuadCurve2D Bir çizgi double,float veya Point2D parametre alabilir. Tek kontrol noktası vardır. CubicCurve2D Bir çizgi double,float veya Point2D parametre alabilir. İki kontrol noktası vardır.

Şekiller Rectangle2D, RoundRectangle2D, Ellipse2D, Arc2D Arc2D için 3 closure seçeneği vardır; CHORT, PIE ve OPEN public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setcolor(color.blue); RoundRectangle2D.Double rrect = new RoundRectangle2D.Double(30,30,100,100,30,30); Rectangle2D.Double rect = new Rectangle2D.Double(30,150,100,100); Ellipse2D.Double ellipse = new Ellipse2D.Double(150,30,80,100); Arc2D.Double arc = new Arc2D.Double(150,150,100,100,0,120,Arc2D.PIE); g2d.fill(rrect); g2d.fill(rect); g2d.fill(ellipse); g2d.fill(arc); }

Constractive Area Geometry Basit şekilleri özel tarzlarda birleştirerek kompleks şekiller oluşturmayı sağlar. Toplama, çıkarma, kesiştirme, XOR Öncelikle Area lar oluşturulur ve bunlar üstünde tüm işlemler gerçekleştirilir. Orjinal Sekiller Toplama Kesiştirme Çıkarma Xor

Örnek public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Ellipse2D.Double circle = new Ellipse2D.Double(15, 15, 90, 90); Rectangle2D.Double square = new Rectangle2D.Double(50, 50, 120, 120); Area first = new Area(circle); Area second = new Area(square); first.add(second); g2d.setpaint(color.yellow); g2d.fill(first); g2d.setpaint(color.black); g2d.draw(first); }

Hat Stilleri (Line Styles) Bir nesneyi çizerken kullanılır. Hat sitilleri stroke attribute ile belirlenir. BasicStroke 3 join stili destekler JOIN_BEVEL JOIN_MITER JOIN_ROUND End-cap özelliği hattın hangi tarzda biteceğini belirler.basicstroke 3 tip end-cap stili destekler. CAP_BUTT CAP_ROUND CAP_SQUARE

Hat Sitilleri (Line Styles) DASH STYLES Dash sitilleri at boyunca hattın belirginlik ve geçirgenliğini belirler. BasicStroke Nesnesi public BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase) public BasicStroke(float width, int cap, int join, float miterlimit) public BasicStroke(float width, int cap, int join) public BasicStroke(float width) public BasicStroke()

Örnek 4 public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; float dash1[] = {10.0f, 5.0f, 10.0f}; BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 10.0f, dash1, 5.0f); Rectangle2D.Double square =new Rectangle2D.Double(10, 10, 300, 300); g2d.setstroke(dashed); g2d.draw(square); }

Java2D de Şekillerin İçini Doldurma Bir şeklin içi doldurulmak istendiğinde Paint attribute u kullanılır. Bir şekil Color (tek renk), GradientPaint (iki veya daha fazla rengin birleşmesiyle), TexturePaint (tiled image), veya Kendi belirlediğiniz bir boyama tekniği ile boyanabilir. setpaint(..) ve getpaint() fonksiyonları kullanılır. Bu metodlar setcolor ve getcolor metodlarının yerine geçer.

Boyamada Tiled Texture lar TexturePaint nesnesi kullanılarak gerçekleştirilir. Bu nesnenin constructor ı iki parametre alır; Hangi resmin çizileceği (BufferedImage) Ne kadar büyüklükle yerleştirilecekleri (Rectangle2D) Kullanımını daha önce de belirttiğimiz gibi setpaint metodu belirler. Bir BufferedImage iki temel yol ile elde edilir. ImageIO sınıfı kullanarak Bir GIF ile yapılandırarak

ImageIO sınıfını kullanmak Standart formatlardaki (GIF,PNG,JPEG gibi) bir resmi okumak gayet basittir; File f = new File("c:\images\myimage.gif"); BufferedImage bi = ImageIO.read(f); BufferedImage nesnesi elde edildikten sonra boyama işlemi aşağıdaki gibi olmalıdır; imagerect = new Rectangle2D(0.0, 0.0, bufferedimage.getwidth(), bufferedimage.getheight()); imagepaint1 = new TexturePaint(bi,imageRect); g2d.setpaint(imagepaint1);

Bir GIF ile yapılandırma- Metot 1 Resimleri yüklemek için bir MediaTracker nesnesine ihtiyaç duyulur. Media Tracker ses veya görüntü gibi media ların yükleme sıra durumlarını takip eder. Birinci metot olarak bir MediaTracker oluşturulur ve bu nesnenin addimage() metodu ile takip edilmesi istenen resimler eklenir.bununla birlikte her bir resim için bir unique id atanır. Bu id ile sıra belirlenmiş olur.

Bir GIF ile yapılandırma- Metot 1 MediaTracker kullanımı; Image image = File("c:\images\myimage.gif"); MediaTracker tracker = new MediaTracker(c); tracker.addimage(image, 0); try { tracker.waitforall(); } catch(interruptedexception ie) {} if (tracker.iserrorany() return null); BufferedImage bufferedimage = new BufferedImage(image.getWidth(this), image.getheight(this), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bufferedimage.creategraphics(); g2d.drawimage(image, 0, 0, this);

Bir GIF ile yapılandırma- Metot 2 MediaTracker ile yükleme gerçekleştiğinde bir thread oluşturulur ve yükleme işlemi tamamlandıktan sonra orijinal thread e (programa) geri dönülür. Swing iconimage sınıfı ise yüklemede başka bir alternatif sağlar. Image image = new ImageIcon( duke.gif ).getimage(); Fakat yine BufferedImage nesnesine ihtiyaç duyulur. Fakat bu yöntemle bir tek resim için bir çok kod karmaşasından kurtulmuş oluruz.

Metinler Metinler drawstring metodu ile render edilirler. drawstring(string str, int x, int y) drawstring(string str, double x, double y) x ve y string in başlangıç koordinatını belirler.

Stilli Metinler (Styled Text) Bunun için AttributedString ve ilgili AttributedCharacterIterator sınıfları kullanılır. Önce bir AttributedString stringi oluşturulur. AttributedString sstr = new AttributedString( Styled Text ) Daha sonra bu nesneye ilgili attribute lar eklenir. Üçüncü olarak AttributedCharacterIterator AttributedString nesnesinden alınır ve drawstring fonkisyonuna verilir.

Örnek public class StyledString extends JPanel { AttributedString astring; Font seriffont = new Font("Serif", Font.PLAIN, 24); public StyledString() { setbackground(uimanager.getcolor("window")); astring = new AttributedString("Use the red button, not the blue"); astring.addattribute(textattribute.font, seriffont); astring.addattribute(textattribute.foreground, Color.red, 8, 11); astring.addattribute(textattribute.foreground, Color.blue, 28, 32); } public void paintcomponent(graphics g){ super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; g2d.drawstring(astring.getiterator(), 10, 50); g2d.drawstring(astring.getiterator(), 10, 100); }

TextLayout drawstring sadece belli metinleri yazmaya yarar. Fakat TextLayout metinler üzerindeki işlemlerde bir çok kolaylık sağlar. Bunların bazıları; Text metrics Hit testing Highlighting support Paragraph Layout on Multiple lines Font Outline Bi-directional text TextLayout Text, Font ve FontRenderContent sınıflarını kullanır. Render etmek için public void draw(graphics 2D g2d, float x, float y)metodu kullanılır.

TextLayout Özellikleri Hit testing Belirtilen koordinattaki text in özelliklerinin alınmasına olanak tanır; örneğin karakter indexi gibi Highligthing Resmin üstünü çizecek diktörtgenin boyutlarını hesaplamayı sağlar.

TextLayout Özellikleri Font outlines Fontların sınır hatlarını render etmeyi sağlar String, Font, and FontRenderContext kullanılarak yeni bir TextLayout sınıfı oluşturulur.daha sonra fontun dış hatları elde edilir. TextLayout texttl = new TextLayout("JAVA", new Font("Helvetica", 1, 96), new FontRenderContext(null, false, false)); AffineTransform textat = new AffineTransform(); textat.translate(0,(float)texttl.getbounds().getheight()); textshape = texttl.getoutline(textat); g2d.draw(textshape); Daha sonra da şekil yazdırılır.

Nesnelerin Geçirgenliği Bir nesnenin geçirgenlik ölçüsü alpha değeri ile belirlenir. Java2D de bu işlemi yapmanın bir şekli AlphaComposite nesnesiyle gerçekleştirilir. private Rectangle bluesquare = new Rectangle(10, 10, 200, 200), redsquare = new Rectangle(50, 50, 200, 200); private AlphaComposite makecomposite(float alpha) { int type = AlphaComposite.SRC_OVER; return(alphacomposite.getinstance(type, alpha)); } public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Composite originalcomposite = g2d.getcomposite(); g2d.setpaint(color.blue); g2d.fill(bluesquare); g2d.setcomposite(makecomposite(0.2)); g2d.setpaint(color.red); g2d.fill(redsquare); }

Nesnelerin Geçirgenliği Diğer bir yöntem ise Color nesnesini alpha parametresi alan constructor ile oluşturmaktır. public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; Color c1 = new Color(0,0,255,1.0); g2d.setpaint(c); g2d.fill(bluesquare); Color c1 = new Color(255,0,0,.2); g2d.setpaint(color.red); g2d.fill(redsquare); }

Nesnelerin Geçirgenliği Render ederken tercihimiz nedir? Hız? Kalite? Hızlı metod (aliasing) Sedece merkezi şeklin içine düşen pixeller renklendirilir. Yani pixel ya renklidir veya değildir. Kaliteli metod (anti-aliasing) Hangi pixelin resim ile çakıştığı hesaplanarak renklendirme yapılır. Her bir pixelin rengi sekli ne kadar içine aldığı ile orantılı olarak değişir. Anti-aliasing standart ekran fontu için kullanılmamalıdır. Bunun dışındaki tüm koşullarda yumuşak geçişleri sağlar.

Koordinat Dönüşümleri Affine Transformations : Dönüüşm sonucunda paralel hatlar yine paralel kalır. İki şekilde dönüşüm gerçekleştirilebilir Nesneyi dönüşümden geçirmek Koordinat sistemini dönüşümden geçirmek Java2D de koordinat sistemi dönüşümü genelde kullanılır. Bu durumda bir defa dönüşüm yapıldıktan sonra tüm yeni eklenecek şekiller bundan etkilenecektir.

Koordinat Sistemini Döndürme Java2D de gerçekleştirilen dönüşümler; Translate --- public void translate(double tx, double ty) Rotate --- public void rotate(double thetaradians) Scale --- scale(double sx, double xy) Shear Custom

Örnek public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setpaint(gpaint); g2d.fill(square); g2d.setpaint(color.white); affine.translate(100, 100); g2d.settransform(affine); g2d.drawstring("--- 0.0", 0, 0); affine.rotate(math.pi/4.0); g2d.settransform(affine); g2d.drawstring("--- 45.0", 0, 0); affine.settoidentity(); } private AffineTransform affine = new AffineTransform();

Nesneleri Döndürme Bu yöntemde ise bir nesneden yeni dönüşüme uyğramış bir nesne elde edilir. arrowrotate = AffineTransform.getRotateInstance(- Math.PI/2, 20, -20); shadowscale = AffineTransform.getScaleInstance(1.0, 0.4); shadowshear = AffineTransform.getShearInstance(-1.25, 0.0); rotatedarrow = arrowrotate.createtransformedshape(arrow); scaledarrow = shadowscale.createtransformedshape(rotatedarrow); skewedarrow = shadowshear.createtransformedshape(scaledarrow); fonttransform = AffineTransform.getScaleInstance(1.0, -1.0); fonttransform.shear(-1.0, 0.0); reflectionfont = textfont.derivefont(fonttransform); shadowscale.shear(-1.25, 0.0); reflectionfont2 = textfont.derivefont(shadowscale);

Rendering Hints Rendering ayarları default olarak hızlıya ayarlanmıştır. Fakat istersek daha kaliteli görünüm için hızdan feda edip Rendering Hint leri kullanabiliriz. Örnek (Yüksek kalite) RenderingHints renderhints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);... public void paintcomponent(graphics g) { // super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; g2d.setrenderinghints(renderhints); RenderingHint nesnesi bir attribute olarak kullanıldığından paint nesnesi içinde tekrar tekrar bu nesneni bir örneği yaratılması pek uygun değildir.

Animasyon Java2D animasyonları için thread ler kullanılır. Oluşturulan basit bir thread ile istenilen zaman aralığında sistemin beklemesi sağlanır. Gerekli değişiklikler bu tread aracığı veya paintcomponent() metodu ile gerçekleştirilebilir. Daha sonra tekrar paintcomponent() metodu çağırılır. Bu metodun çağırılımı özel olarak kullanılan repaint() metodu ile gerçekleştirilir. while ( fthread!= null){ try{ Thread.sleep (25); } catch (InterruptedException e) { } panel.repaint (); }

Animasyon Diğer bir kullanım Timer ları kullanmaktır. Animasyon yapılan sınıf TimerTask nesnesinden kalıtlanır. TimerTask aynı threadlerde olduğu gibi run() metodunu içerir. Fakat run() metodunun direk olarak çağrımı söz konusu değildir. public final class SimpleAnimation extends TimerTask { public static void main(string[] arguments ) { TimerTask sanim = new SimpleAnimation(); Timer timer = new Timer(); timer.scheduleatfixedrate(sanim, new GregorianCalendar().getTime(), 1000); } public void run(){ //toy implementation repaint(); } public void paintcomponent(graphics g) { }

Rendering işlemi (Genel Bakış) Graphics Primitives Shapes fill() draw() Graphics2D stroke Transformation Text Images DrawString() drawimage() font Rendering hints rasterizer Clipping shape paint Compositing rule images Output Devices