|
|
tekzaf@yahoo.com |
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 }
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.
|
|