Java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

16 Aralık 2010 Perşembe

Headless Ortamlarda Toolkit Kullanımı

Ekran, klavye veya fare'siz ortamlarda grafik arayüz kodları içeren bir Java uygulaması çalıştırırsanız HeadlessException alabilirsiniz. Linux/UNIX bir sunucuya telnet/ssh ile bağlandığınızda, uygulamanız sistem servisi olarak çalıştığında ve benzeri durumlarda bu hata ortaya çıkar.

Java'nin 1.4 versiyonundan itibaren bu durum için Headless mode desteği vardır. Uygulamanızı Headless mode'da çalıştırdığınızda sistem, Toolkit olarak HeadlessToolkit kullanır ve uygulamanızın ihtiyaç duyduğu bazı kaynakları ve parametreleri sağlar.
Uygulamanızın Headless mode'da başlaması için uygulamanızı -Djava.awt.headless=true parametresi ile çalıştırmalısınız. Panel, Canvas gibi bileşenler ve Swing bileşenleri Headless mode'da kullanabilirsiniz, ama JFrame, JDialog gibi en üst seviye container'ları kullanamazsınız.
Headless mode ile ilgili ayrıntılı bilgiye aşağıdaki bağlantıdan erişebilirsiniz.

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/

HeadlessToolkit'in sağladıkları sizin için yeterli olmayabilir. Örneğin Toolkit'in getScreenResolution, createCustomCursor metodlarına ihtiyacınız var. Bu gibi durumlarda aşağıdaki gibi bir Toolkit tanımlamalısınız.



public class CustomToolkit extends HeadlessToolkit {

    public CustomToolkit() {
        super(createSystemToolkit());
    }

    private static Toolkit createSystemToolkit() {
        String osName = System.getProperty("os.name");
        String toolkitClass = osName.startsWith("Windows") ? "sun.awt.windows.WToolkit" : "sun.awt.X11.XToolkit";
        try {
            Class<?> clazz = Class.forName(toolkitClass);
            Object toolkitInstance = clazz.newInstance();
            return (Toolkit)toolkitInstance;
        }
        catch (Exception exc) {
            throw new RuntimeException(exc);
        }
    }

    @Override
    public int getScreenResolution() throws HeadlessException {
        return 72;
    }

    @Override
    public Insets getScreenInsets(GraphicsConfiguration graphicsConfiguration) throws HeadlessException {
        return new Insets(0, 0, 30, 0);
    }

    @Override
    public Cursor createCustomCursor(Image image, Point point, String s)
            throws IndexOutOfBoundsException, HeadlessException {
        return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
    }

}

createSystemToolkit metodunda işletim sistemine göre Toolkit döndürüyoruz. Reflection kullanmamızın sebebi Windows'taki JRE'lerde XToolkit'in, Linux'teki JRE'lerde WToolkit'in bulunmaması.

Bunun gibi problem yaşadığınız Toolkit metodlarını ezebilirsiniz.

Toolkit'imizin etkin olabilmesi için uygulamanızı aşağıdaki parametrelerle çalıştırmalısınız.
-Djava.awt.headless=false
-Dawt.toolkit=CustomToolkit

30 Eylül 2010 Perşembe

Herhangi Bir Sınıfa Listener Desteği Sağlamak

Başka sınıfların bizim sınıfımıza ActionListener olarak kaydolmalarını ve sınıfımızın iç işleyişi sırasında bir durum oluştuğunda actionPerformed olayını atmak istiyoruz. Bunun için sınıfımızda yapmamız gereken tanımlamalar aşağıdaki gibidir.

public class XYZ {
    private ActionListener listenerList;

    .....
    .....
    // diğer sınıflar bu metot aracılığıyla bizim sınıfımızda oluşan olaya kayıt yaptırabilir.
    public void addActionListener(ActionListener listener) {
        if (listener == null) {
            return;
        }
        listenerList = AWTEventMulticaster.add(listenerList, listener);
    }

    // diğer sınıflar bizde gerçekleşen olaylardan artık haberdar olmak istemiyorsa bu metodu kullanmalıdır.
    public void removeActionListener(ActionListener listener) {
        if (listener == null) {
            return;
        }
        listenerList = AWTEventMulticaster.remove(listenerList, listener);
    }
   
    // sınıfımızda oluşan durumda olay atmak için bu metodu kullanacağız.
    private void fireActionEvent() {
        ActionListener listener = listenerList;
        if (listener != null) {
            // burada isterseniz başka source, id ve command parametreleri geçebilirsiniz.
            ActionEvent event = new ActionEvent(this, 0, null);
            listener.actionPerformed(event);
        }
    }

    .....
    .....
        // beklenilen durum gerçekleşti, olay atalım.
        fireActionEvent();
    .....
    .....

}

Input/Output Stream ve Reader/Writer'lar ile Çalışmak

Input/Output Stream (aynı durum Reader/Writer'lar için de geçerlidir.) değişkeni try/finally bloğundan önce tanımlanmalı, try bloğu içinde oluşturulmalı ve finally bloğu içinde kapatılmalı (close). Catch bloğu tanımlanmamış olsa dahi finally bloğu tanımlanıp bu işlemler yapılmalıdır.


Örnek:


InputStream is = null;
try {
    is = new FileInputStream(inputFileName);
    is.....
    .......
    .......
}
finally {
    if (is != null) {
        try {
            is.close();
        }
        catch (Exception exc) {
            // logla
        }
}

18 Aralık 2009 Cuma

Eclipse

Bu yazıda anlatılanlar Eclipse'in 3.5 versiyonunda tespit edilmiştir. Teorik olarak farklı versiyonlarda farklı yapılar olabilmekle beraber pratikte yaklaşık tüm versiyonlar için geçerli olduğu düşünülmektedir.


 

Workspace dizin ve dosyaları

Proje listesi ve dizinleri

org.eclipse.core.resources dizininde proje listesi ve bu projeler ile ilgili bazı ayarlar yer almakta. .projects/proje_adı/.location dosyasında projenin konum bilgisi yer almakta. .root ve .safetable dizinleri de yine projeler ile ilgili gerekli bazı referansları tutmak ve bu dizinler silinmemeli. Silinirse Eclipse tekrar açıldığında proje listesi boş gelmektedir.
Workspace'in encodingi
org.eclipse.core.runtime\.settings\org.eclipse.core.resources.prefs dosyasına encoding=UTF-8 kaydı eklenerek workspace'in varsayılan encoding'i UTF-8 yapılabilir.
Kullanıcı tanımlı kütüphaneler
Kullanıcı tarafından tanımlanan kütüphane tanımları org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs dosyasında tutulmaktadır.
Açılışta tanıtım ekranının görünmesi
org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs dosyasındaki showIntro değişteninin değeri false yapılarak tanıtım Eclipse açıldığında tanıtım ekranının açılması engellenebilir.
Perspective ve View'ler
Workspace'te hangi perspective ve view'lerin yer aldığı bilgisi org.eclipse.ui.workbench/workbench.xml dosyasında tutulmaktadır.
org.eclipse.core.resources/.span
Bu dosya workspace oluşturulurken geçici olarak üretilmekte ve workspace oluşturulduktan sonra silinmektedir.

26 Ağustos 2009 Çarşamba

JIDE

JIDE, Swing bileşen kütüphanesidir.

JIDE'nin paketinde gerekli doküman ve örnek kodlar da mevcut.

doc dizininde tüm modüllerin geliştirici klavuzları mevcuttur.

javadoc dizininde API dokümanları mevcuttur.

Örnek uygulama jidesoft'un sitesinden Java Web Start ile çalıştırılabilir. Örnek uygulamadan ilgili ekran ve bileşenlerin kullanımı ile ilgili kodlara ulaşılabilir. Örnek uygulamaya ait kodlar aynı zamanda examples dizininde de mevcuttur.

Bazı Bileşenler

Common Layer

JideSplitButton: Ana fonksiyonalite için bir düğme ve yan fonksiyonalite için bir menüden oluşan bileşen.
JideTabbedPane: Başılığında ikon gösterilebilen sekme uyarlaması. Sekme sayısı belirlenen sayıyı geçerse sekmelere menü araçılığıyla ulaşılabilir. İstenirse farenin orta düğmesi ile sekme kapatılabilir.
CheckBoxList: JCheckBox desteği olan liste. İstenilen elemanlar disable edilebilir.
CheckBoxTree: JCheckBox desteği olan ağaç bileşeni. Dig In özelliği ile parent eleman seçildiği zaman child elemanların da seçilip seçilmeyeceği belirlenebilir.
Searchable: JTree, JTable, JList, JTextComponent, JComboBox ve bazı JIDE bileşenlerinde kullanıcı aradığı elemanın baş harflerini yazdığında eşleşen eleman seçili duruma gelir.
SearchableBar: Ctrl+f tuşları ile Firefox'un arama paneline benzer bir arama paneli açıp ilgili bileşende kayıt aranabilemsini sağlar.
JidePopup: JPopup'tan farklı olarak taşınabilmekte, yeniden boyutlandırılabilmekte ve belli bir zaman sonra otomatik olarak kapanabilmekte.
JideSplitPane: 2'den fazla bileşen eklenebilir.
RangeSlider: Tamsayı aralık seçmek için kullanılabilecek bileşen.
Overlayable: Bir bileşenin üstünde küçük, bilgilendirici başka bir bileşen göstermek için kullanılır. Örneğin bir bileşene veritabanından veriler yüklenirken progress bar gösterip işlem bittiğinde kaybolması.
ObjectConverter: Bileşenin, veri sınıfının toString fonksiyonu ile dönen değer yerine hesaplanan başka bir değeri göstermesini sağlar. Örneğin combobox'ta şehirler gösterildiği varsayılsın. Şehir nesnesinin toString'i yerine adı ile nüfusunun birleşimi gösterilebilir. Ortam yapılandırılırken ObjectConverterManager sınıfına veri tipi, converter nesnesi ve context kaydı yapılmalıdır. İlgili bileşende de setConverterContext fonksiyonu ile hangi context'e göre gösterim uygulanacağı belirlenmeli.
DateSpinner: Verilen formatta tarih yazmak için kullanılabilecek spinner bileşeni.

Docking Framework

DockableFrame: Dock özelliği olan panel desteği sağlar. DockableFrame'larin floating/docking, auto-hide on/off ve close desteği mevcuttur.

Action Framework

CommandBar: MS Ofis'in 2007'den önceki versiyonlarındaki araç çubukları gibi taşınabilen ve ayrı bir diyalog gibi kullanılabilen araç çubuğu özelliği sağlar.
CommandMenuBar: CommandBar'ın menü uyarlaması.

Components

CollapsiblePane: Windows Explorer'da ve birçok Microsoft uygulamasındaki açılır/kapanır panel görüntüsünü sağlayan bileşen.
FloorTabbedPane: Sekmelerin yukarıdan aşağıya listelendiği ve ilgili panelin sekmeler arasında görüntülendiği JTabbedPane uyarlaması.
OutlookTabbedPane: MS Outlook'daki gibi sekmelerin alt tarafta ve alt alta listelendiği, ilgili panelin yukarıda görüntülendiği JTabbedPane uyarlaması.
Alert: MS Outlook'daki mesaj ekranları gibi uyarı mesajlarının ekranın belirli bir kısmında kayarak gelmesini sağlayan bileşen. Mesaj diyaloğunun ekranın hangi kısmından gelip hangi kısmından çıkacağı, belli bir süre sonra kaybolacak mı yoksa kullanıcı kapatana kadar kalacak mı ve benzeri ayarlar verilebiliyor.
BalloonTip: Balon şeklinde görülen tooltip uyarlaması.

Grids

SortableTable, SortableList, SortableComboBox, SortableTree: Sıralama desteği olan bileşenler.
FilterableTableModel: MS Excel'de başık satırı sabitlendikten sonra istenilen sütun başlığından verilerin filtrelenmesi özelliğini sağlayan bileşen.
ShrinkSearchableSupport: JList, JComboBox ve JTable'da kullanıcı aramak istediği kaydın baş harflerini yazdıkça eşlenik olmayan kayıtları gizleyen, sadece eşlenik kayıtların gösterilmesini sağlan yardımcı sınıf.
TreeTable: Tablo'nun bir sütunu ağaç yapısı şeklinde görünür. Ağaç yapısının açma/kapama (expand/collaps) desteği vardır.
HierarchicalTable: Satır aralarında fazladan bileşen bulundurabilen JTable uyarlaması. Windows'un program ekle/kaldır ekranına benzer ekranlar yapılabilmekte.
GroupTable: Belli sütundaki değerlere göre verileri gruplayabilmekte.
GroupList: Gruplama özelliği olan liste uyarlaması.
JideTable: Çok katmanlı sütun gruplama, hücre güncellemede fazladan editingStarting, editingStarted ve editingStopping eventlerinin fırlatılması, hücre güncellemede kontrol gibi özelliklerin eklendiği JTable uyarlaması.
TableScrollPane: Satır başlığı, satır sonu, sütun sonu gibi ek alanlar (JScrollPane'ın sağladıklarına ek olarak), sütun sabitleme (sadece istenilen sütunların scroll edilmesi, diğer sütunların scroll edilmemesi) gibi özellikler sağlamaktadir.
TableSplitPane: Büyük bir tablonun sütunlarını jidenin split pane'inde birçok pane'e parçalayabilen, aynı zamanda da gezinme, sıralama, scroll etme gibi özellikleri de kaybetmeyen bileşen.
DualList: İkili liste vasıtasıyla kayıt seçme ve sıralama desteği sağlayan bileşen.
TableColumnAutoResizer, TableRowAutoResizer, TableColumnResizer, TableRowResizer: Kullanıcının tablonun satır ve sütunlarını yeniden boyutlandırabilmesine imkan sağlamaktadır.
TableUtils: Tablonun seçim, satır/sütun boyutu, sütunların sıralaması, scroll durumu gibi birçok ayarını kaydetme ve yeniden yüklemeye imkan sağlayan yardımcı sınıflar.
DateComboBox, ColorComboBox, TreeComboBox, ListComboBox, FileChooserComboBox: Tarih, renk, font ve benzeri tipte veri seçmek için kullanılan, popup'ında liste, tablo, ağaç, checkboxlist ve benzeri birçok bileşeni gösterebilen, popup'ı yeniden boyutlandırılabilen JComboBox uyarlamasıdır.
DateChooserPanel: Gün seçmek için kullanılan takvim görünümlü bileşen.
MonthChooserPanel: Ay seçmek için kullanılan bileşen.

Dialogs

WizardDialog: Wizard hazırlamak için hazır diyalog.
MultiplePageDialog: Bazı uygulamaların seçenekler ekranlarındaki gibi ikonlu tabbed pane uyarlaması.
AggregateTable: Satırları gruplamaya imkan sağlayan ağaç yapılı tablo uyarlaması.

Data Grids

PageNavigationBar: JList ve JTable'da çok fazla veri olduğunda verilerin sayfa sayfa gösterilmesi ve sayfalar arasında gezinmeye imkan sağlamaktadır.

Shortcut Editor

ShortcutEditor: Uygulamanın tüm kısayollarını yönetmeye yarayan bileşen. Şema desteği, xml olarak kaydetme ve yeniden yüklemek için yardımcı foksiyonları mevcuttur.

Dashboard

Dashboard: Portal benzeri arayüzler oluşturmaya imkan sağlayan bileşendir.

12 Ağustos 2009 Çarşamba

Spring

Enterprise uygulama geliştirmenin karmaşıklığını ortadan kaldırmak için Rod Johnson tarafından geliştirilen açık kaynak kodlu bir altyapıdır. Spring; daha önce EJB'lerle yapılabilen birçok fonksiyonaliteyi POJO'lar (Plain Old Java Object - Herhangi bir interface'i genişletmek zorunda olmadığınız, sadece sizin ihtiyaç duyduğunuz özellik ve metodları barındıran sınıflar) üzerinden yapabilmeye imkan sağlamaktadır. Spring sadece enterprise uygulamalarda değil, diğer pek çok türdeki uygulamada da kolaylıklar sağlamaktadır.

"Dependency Injection" Spring'in çıkış noktalarından biridir. Dependency Injection tasarım kalıbı yazılımın bileşenleri arasında bağımsızlığı sağlar. Bu durum aynı zamanda "Don't call me, I will call you" (Beni arama, ben seni arayacağım) Hollywood prensibi olarak da ifade edilir.

Hibernate

Hibernate nesne, veritabanı eşlemesi için bir altyapıdır. Başlangıçta Java ile geliştirilmesine rağmen NHibernate isminde .Net ile geliştirilen versiyonu da mevcuttur.

ORM: Object/Relational Mapping. Nesne veritabanı eşlemesi. Java nesnelerimiz ile relational veritabanı arasında ilişki kurmayı ifade eder.

Hibernate'de ORM, XML ile sağlanmakta. Hibernate'in son versiyonları bu eşlemeyi annotation ile de yapmaya imkan sağlamakta.