Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > И снова подсветка синтаксиса


Автор: gibbzy 29.3.2008, 19:14
Вопрос по SWING
Приветствую всех. 
Передомной встал вопрос создания подсветки синтаксиса в текстовом редакторе. 
Я беру JScrollPane 
Размещаю там JEditorPane
Далее беру Plain Document 
помещаю его в JEditorPane
Дале вешаю на него documentListener

Дальше по логике он должен парсить при каждом введёном символе докумет на слова слова разделяються либо Пробелом либо скобкой "(" или ")" ну и там все возможные варианты 
распарсенные слова сравниваються с базой данных тех слов которые нужно подсвечивать. 

если совпадает тогда подсвечиваем тем или иным цветом 
вопрос: 
как установить цвет для определённого слова? 
ну или скажем для определённого набора символов начинающихся с определённой позиции и заканчивающихся определённой позицией ?

пока имею вот что : 
Код



package jte;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.*;

public class JTEFrame extends javax.swing.JFrame {

    /** Creates new form JTEFrame */
    public JTEFrame() {
        initComponents();
      //  jEditorPane1.setEditorKit(EKit);
        jEditorPane1.setDocument(doc);
        doc.addDocumentListener( new DocLis());
      
    }
  
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jEditorPane1 = new javax.swing.JEditorPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPane1.setViewportView(jEditorPane1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
 
public void doit(){
System.out.println(EKit.getContentType());

}

    // Variables declaration - do not modify
    public static javax.swing.JEditorPane jEditorPane1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration
    public static  PlainDocument doc = new PlainDocument();
    public StyledEditorKit EKit = new StyledEditorKit();
     Document d = EKit.createDefaultDocument();
}


class DocLis implements DocumentListener {

    public void insertUpdate(DocumentEvent e) {
     
    }

    public void removeUpdate(DocumentEvent e) {
    
    
    }

    public void changedUpdate(DocumentEvent e) {
      
      
    }


}


Автор: gibbzy 29.3.2008, 19:40
И ещё пожалуйста киньте ктонибудь описание EditorKit PlainDocument Element VievFactory, помимо java docs API и Портянкина.

Автор: dorogoyIV 30.3.2008, 11:23
реагирует на набор символов "red"
Код

import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;

public class JTEFrame extends JFrame
                      implements KeyListener
{
 String string="red";
 JTextPane jtp;
 int start=0, end=0;

 public JTEFrame()
 {
  initComponents();
  jtp.addKeyListener(this);
 }
  
 private void initComponents()
 {
  jtp = new JTextPane();
  setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  setSize(400, 300);
  add(new JScrollPane(jtp));
 }

 public void setRed()
 {
  SimpleAttributeSet red = new SimpleAttributeSet();
  StyleConstants.setForeground(red, Color.red);
  StyledDocument doc = jtp.getStyledDocument();
  doc.setCharacterAttributes(start, end, red, false);
 }

 public void keyTyped(KeyEvent e){} 
 public void keyPressed(KeyEvent e){}
 public void keyReleased(KeyEvent e)
 {
  if(jtp.getText().length() >= string.length())
  {
   String s=jtp.getText();

   if(s.substring(s.length()-string.length(),
                  s.length()).equals(string))
   {
    start = s.length() - string.length();
    end = start + string.length();
    setRed();
   }
  }
 }

 public static void main(String [] args)
 {
  new JTEFrame().setVisible(true);
 }
}

Автор: gibbzy 30.3.2008, 16:26
Большое спасибо. Выслал бы вам банку пива по почте  smile 

Автор: Кайне 8.11.2009, 13:45
насколько я понял такой способ не работает если текст вставляется копипастом.
попробовал сделать такое в DocumentListener  - не работает.Выдает ошибку связанную с AbstractDocument, говорит что-то вроде(исходника под рукой нет) attempt to mutate че-то в AbstractDocument.

Автор: dorogoyIV 8.11.2009, 14:07
там идет сбой при вставке символа - "переход на новую строку" (когда ентер нажали)

Цитата(Кайне @  8.11.2009,  13:45 Найти цитируемый пост)
если текст вставляется копипастом

надо добавить к обработчику сочетание клавиш...

Автор: leskar 14.11.2009, 20:57
Цитата(gibbzy @ 29.3.2008,  19:40)
И ещё пожалуйста киньте ктонибудь описание EditorKit PlainDocument Element VievFactory, помимо java docs API и Портянкина.

Смотрите сырцы жавы. Лучше любой документации smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)