İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Zafer Teker
tekzaf@yahoo.com

XML kodlarını Renkli Gösteren Bir TextPane Örneği

Web veya Xml editorlerinde HTML veya XML kodları renklendirilmektedir. Biz de Java'da XML kodlarını renkli gösteren bir JTextPane yaptık. Böylece HomeSite benzeri bir editor yaratabilirsiniz.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.codeeditor;
  2 import java.awt.*;
  3 import javax.swing.*;
  4 import javax.swing.event.*;
  5 import javax.swing.text.*;
  6 public class CodePane extends JTextPane implements DocumentListener{
  7   private SimpleAttributeSet theDefaultAttributeSet=new SimpleAttributeSet();
  8   private SimpleAttributeSet theElementAttributeSet=new SimpleAttributeSet();
  9   private SimpleAttributeSet theAttributeAttributeSet=new SimpleAttributeSet();
 10   private DocumentEvent event;
 11   public CodePane(){
 12     getDocument().addDocumentListener(this);
 13     StyleConstants.setForeground(theElementAttributeSet,Color.blue);
 14     StyleConstants.setBold(theElementAttributeSet,true);
 15     StyleConstants.setForeground(theAttributeAttributeSet,new Color(0xaa,0x5a,0xcc));
 16     StyleConstants.setBold(theAttributeAttributeSet,true);
 17     StyleConstants.setForeground(theDefaultAttributeSet,Color.black);
 18     StyleConstants.setBold(theDefaultAttributeSet,false);
 19   }
 20   public void changedUpdate(DocumentEvent e){}
 21   public void insertUpdate(DocumentEvent e){
 22     event=e;
 23     Runnable runnable=new Runnable(){
 24       public void run(){
 25         stylize(event);
 26       }
 27     };
 28     SwingUtilities.invokeLater(runnable);
 29   }
 30   public void removeUpdate(DocumentEvent e){
 31     event=e;
 32     Runnable runnable=new Runnable(){
 33       public void run(){
 34         stylize(event);
 35       }
 36     };
 37     SwingUtilities.invokeLater(runnable);
 38   }
 39   private void stylize(DocumentEvent e){
 40     try{
 41       int start=getStartIndex(e);
 42       int finish=getFinishIndex(e);
 43       stylize((StyledDocument)e.getDocument(),start,finish);
 44     }catch(Exception ex){
 45       ex.printStackTrace();
 46     }
 47   }
 48   private void stylize(StyledDocument document,int start,int finish){
 49     try{
 50       boolean done=false;
 51       document.setCharacterAttributes(start,finish-start+1,theDefaultAttributeSet,false);
 52       String text=document.getText(start,finish-start+1);
 53       int last=0;
 54       while(!done){
 55         int lt=text.indexOf('<',last);
 56         if(lt!=-1){
 57           int gt=text.indexOf('>',lt+1);
 58           if(gt!=-1){
 59             try{
 60               document.setCharacterAttributes(start+lt,gt-lt+1,theElementAttributeSet,false);
 61               styleAttibuteValues(document,text,lt,gt,start);
 62               last=gt+1;
 63             }catch(Throwable e){
 64               e.printStackTrace();
 65             }
 66           }else{
 67             done=true;
 68           }
 69         }else{
 70           done=true;
 71         }
 72       }
 73     }catch(Throwable e){
 74       e.printStackTrace();
 75     }
 76   }
 77   private void styleAttibuteValues(StyledDocument document,String text,int lt,int gt,int start){
 78     try{
 79       boolean done=false;
 80       int last=lt;
 81       while(!done){
 82         int opener=text.indexOf('\"',last);
 83         if(opener!=-1){
 84           int closer=text.indexOf('\"',opener+1);
 85           if(closer!=-1 && closer<gt){
 86             document.setCharacterAttributes(start+opener,closer-opener+1,theAttributeAttributeSet,false);
 87             last=closer+1;
 88           }else{
 89             done=true;
 90           }
 91         }else{
 92           done=true;
 93         }
 94       }
 95     }catch(Exception e){
 96       e.printStackTrace();
 97     }
 98   }
 99   private int getStartIndex(DocumentEvent e)
100       throws Exception
101   {
102     int offset=e.getOffset();
103     int length=e.getLength();
104     Document doc=e.getDocument();
105     String text=doc.getText(0,offset+1);
106     int index=text.lastIndexOf("<");
107     if(index!=-1){
108       return index;
109     }else{
110       return 0;
111     }
112   }
113   private int getFinishIndex(DocumentEvent e)
114       throws Exception
115   {
116     int offset=e.getOffset();
117     int length=e.getLength();
118     Document doc=e.getDocument();
119     int docLength=doc.getLength();
120     int start=offset+length;
121     int finish=docLength-start;
122     if(e.getType()==DocumentEvent.EventType.REMOVE){
123       start=offset;
124       finish=docLength-start;
125     }
126     String text=doc.getText(start,finish);
127     int index=text.indexOf(">");
128     if(index!=-1){
129       return start+index;
130     }else{
131       return docLength;
132     }
133   }
134 }

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.codeeditor;
  2 import javax.swing.*;
  3 import java.awt.*;
  4 public class AppFrame extends JFrame{
  5   public AppFrame(){
  6     setBounds(10,10,400,400);
  7     CodePane pane=new CodePane();
  8     getContentPane().setLayout(new BorderLayout());
  9     getContentPane().add(new JScrollPane(pane),BorderLayout.CENTER);
 10     setVisible(true);
 11   }
 12   public static void main(String[] args) {
 13     new AppFrame();
 14   }
 15 }

CodePane Class'ı

JTextPane class'ı ile yazılara stil verebilirsiniz. Bunun için SimpleAttributeSet kullanılabilir. Biz üç tane SimpleAttributeSet yarattık. theElementAttributeSet tag'ları renklendirmek için. theAttributeAttributeSet tag içindeki attribute değerlerini renklendirmek için, theDefaultAttributeSet normal durum içindir. SimpleAttributeSet 'ler yaratıldıktan sonra

StyleConstants.setForeground(theElementAttributeSet,Color.blue);
StyleConstants.setBold(theElementAttributeSet,true);
StyleConstants.setForeground(theAttributeAttributeSet,new Color(0xaa,0x5a,0xcc));
StyleConstants.setBold(theAttributeAttributeSet,true);
StyleConstants.setForeground(theDefaultAttributeSet,Color.black);
StyleConstants.setBold(theDefaultAttributeSet,false);

şeklinde özelliklerini set ediyoruz. Biçimlendirme işlemi

document.setCharacterAttributes(start,finish,theElementAttributeSet,false);

şeklinde yapılır. start'tan finish'e theElementAttributeSet biçimi uygulanmış olur.

Biçimlendirme yöntemimiz ise şöyle. Bir DocumentEvent oluştuğu zaman (Kullanıcı giriş yapması veya bir şey silmesi sonucu oluşabilir.) Biçimlendirme işleminin hangi index'ler arasında yapılacağı tespit edilmelidir. Biz giriş yapılan yerin öncesindeki "<" işaretinden, girilen yerin sonrasındaki ">" işaretine kadar biçimlendirme yapmaktayız. Bu yerleri bulmak için de getStartIndex ve getFinishIndex method'larını yarattık. Bu fonksiyonlar sonucunda hangi index'ler arasını renklendireceğimiz ortaya çıkar.

stylize(StyledDocument document,int start,int finish)

method'u stillendirme işlemini tamamlamaktadır. Önce

document.setCharacterAttributes(start,finish-start,theDefaultAttributeSet,false);

ile biçimlendirilecek yer varsayılan biçimine getirilir. (Böylece eğer yazılar renkli ise normal hale gelir). Daha sonra her < ve > arası için

document.setCharacterAttributes(start+lt,gt-lt+1,theElementAttributeSet,false);
styleAttibuteValues(document,text,lt,gt,start);

işlemi gerçekleştirilir. styleAttibuteValues methodu "" içindeki attribute'leri set etmek içindir. stylize methodu tamamlandığında renklendirme işlemi tamamlanmış olur.

CodePane class'ı JTextPane'i extend ettiği için eğer bir XML editorune ihtiyacınız varsa CodePane kullanılabilir.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır