Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отображение непечатаемых символов, как можно реализовать?? 
:(
    Опции темы
philips
Дата 19.3.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



собственно, как можно реализовать отображение непечатаемых символов (пробела, табуляции и др)?? smile

спс заранее..
PM   Вверх
LSD
Дата 19.3.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(philips @  19.3.2008,  01:11 Найти цитируемый пост)
собственно, как можно реализовать отображение непечатаемых символов (пробела, табуляции и др)??

Отображение где?
Самый простой заменить их на некие отображаемые.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
philips
Дата 20.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



отображение на текстовом поле (JTextPane либо JTextArea).

хотелось бы не тупо заменять символы а например при табуляции нарисовать стрелочку от начала табуляции и до конца (может быть разной длины), при пробеле точка по середине, на месте перевода строки знак "П" и тд. чтоб все красиво было smile

и при замене символов думаю будут разные неудобства в дальнейшем. :/

PM   Вверх
LSD
Дата 20.3.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Посмотри в сторону Highlighter-а. Вот пример который подсвечивает слово public, тебе нужно переделать его чтобы он рисовал непечатаемые символы.
Код

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

public class Test extends JFrame
{
  private JTextArea textComp = new JTextArea();
  private Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);

  public Test()
  {
    textComp.setText("public class Test extends JFrame\n" +
                     "{\n" +
                     "  private JTextArea textComp = new JTextArea();\n" +
                     "  private Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);\n" +
                     "\n" +
                     "  public Test()\n" +
                     "  {\n" +
                     "    textComp.setText(\"\");\n" +
                     "    setDefaultCloseOperation(DISPOSE_ON_CLOSE);\n" +
                     "    setLocationRelativeTo(null);\n" +
                     "    setVisible(true);\n" +
                     "  }\n" +
                     "}");
    getContentPane().add(textComp);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    setLocationRelativeTo(null);
    pack();
    setVisible(true);
    highlight(textComp, "public");
  }

  public static void main(String[] args)
  {
    new Test();
  }

  public void highlight(JTextComponent textComp, String pattern)
  {
    removeHighlights(textComp);

    try
    {
      Highlighter hilite = textComp.getHighlighter();
      Document doc = textComp.getDocument();
      String text = doc.getText(0, doc.getLength());
      int pos = 0;

      while((pos = text.indexOf(pattern, pos)) >= 0)
      {
        hilite.addHighlight(pos, pos + pattern.length(), myHighlightPainter);
        pos += pattern.length();
      }
    }
    catch(BadLocationException e)
    {
      e.printStackTrace();
    }
  }

  public void removeHighlights(JTextComponent textComp)
  {
    Highlighter hilite = textComp.getHighlighter();
    Highlighter.Highlight[] hilites = hilite.getHighlights();

    for(Highlighter.Highlight hilite1 : hilites)
    {
      if(hilite1.getPainter() instanceof MyHighlightPainter)
      {
        hilite.removeHighlight(hilite1);
      }
    }
  }

  class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter
  {
    public MyHighlightPainter(Color color)
    {
      super(color);
    }
  }
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
philips
Дата 21.3.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



в интерфейсе Highlighter.HighlightPainter есть метод 
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c)

Код

class MyHighlightPainter implements Highlighter.HighlightPainter {
        
    @Override
    public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
        g.setColor(Color.RED);
        g.fillRect(1, 1, 100, 100);
    }
        
}


p0 и p1 это смещение в тексте подсвечиваемого участка. как это смещение перевести в координаты x и y относительно текстового компонента, чтобы можно было рисовать на этом самом участке. 

и при рисовании например обычного примоугольника в углу компонента, получается что он находится за текстом и при выделении текста он затирается. как быть??

может еще какие-нибудь есть способы?? :/

оффтоп: как в JTextPane реализовать размер табуляции и wrapLine как это реализовано в JTextArea??


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  1.GIF 13,65 Kb
PM   Вверх
LSD
Дата 21.3.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(philips @  21.3.2008,  14:07 Найти цитируемый пост)
как это смещение перевести в координаты x и y относительно текстового компонента

У тебя есть Shape это и есть границы в которых ты должен рисовать.

Цитата(philips @  21.3.2008,  14:07 Найти цитируемый пост)
и при рисовании например обычного примоугольника в углу компонента, получается что он находится за текстом и при выделении текста он затирается. как быть??

Highlight не затирается.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
philips
Дата 21.3.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



хм... bounds как я понял содержит границы всего текстового компонента

System.out.println(bounds.getBounds().x);
System.out.println(bounds.getBounds().y);
System.out.println(bounds.getBounds().width);
System.out.println(bounds.getBounds().height);

выводит 

0
0
676
208

а как узнать именно координаты текущего участка??

Это сообщение отредактировал(а) philips - 21.3.2008, 14:38
PM   Вверх
LSD
Дата 21.3.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Use the source Luke smile 

Посмотри как это делается в DefaultHighlightPainter
Код

TextUI mapper = c.getUI();
Rectangle p0 = mapper.modelToView(c, offs0);
Rectangle p1 = mapper.modelToView(c, offs1);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
philips
Дата 21.3.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



вот..

Код


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


public class TestFrame extends JFrame {
    
    public static void main(String[] args) {
        new TestFrame();
    }
    
    public TestFrame() {
        textComp = new JTextPane();
        textComp.setText("public class Test extends JFrame\n" +
                "{\n" +
                "\t\tprivate JTextArea textComp = new JTextArea();\n" +
                "\t\tprivate Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);\n" +
                "\n" +
                "  public Test()\n" +
                "  {\n" +
                "    textComp.setText(\"\");\n" +
                "    setDefaultCloseOperation(DISPOSE_ON_CLOSE);\n" +
                "    setLocationRelativeTo(null);\n" +
                "    setVisible(true);\n" +
                "  }\n" +
        "}");
        textComp.setFont(new Font(Font.DIALOG_INPUT , Font.PLAIN, 14));
        textComp.getDocument().addDocumentListener(new MyDocumentListener());
        highlighter = textComp.getHighlighter();
        
        getContentPane().add(textComp);
        
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setSize(500, 400);
        setLocation(300, 400);
        show();
        tabsHighlightPainter = new TabsHighlightPainter();
        spaceHighlightPainter = new SpaceHighlightPainter();
        returnHighlightPainter = new ReturnHighlightPainter();
        highlight(textComp, tabsHighlightPainter, "\t");
        highlight(textComp, spaceHighlightPainter, " ");
        highlight(textComp, returnHighlightPainter, "\n");
    }
    
    public void highlight(JTextComponent textComp, Highlighter.HighlightPainter highlightPainter, String pattern) {
        try {
            Document doc = textComp.getDocument();
            String text = doc.getText(0, doc.getLength());
            int pos = 0;
            while((pos = text.indexOf(pattern, pos)) >= 0) {
                highlighter.addHighlight(pos, pos + pattern.length(), highlightPainter);
                pos += pattern.length();
            }
        }
        catch(BadLocationException e) {
            e.printStackTrace();
        }
    }
    
    private JTextPane textComp;
    private Highlighter.HighlightPainter tabsHighlightPainter;
    private Highlighter.HighlightPainter spaceHighlightPainter;
    private Highlighter.HighlightPainter returnHighlightPainter;
    private Highlighter highlighter;
    
    private class MyDocumentListener implements DocumentListener {
        
        @Override
        public void insertUpdate(DocumentEvent evt) {
            int pos = evt.getOffset();
            char keyChar = textComp.getText().charAt(pos);
            highlightSymbols(pos, keyChar);
        }
        
        private void highlightSymbols(int pos, char keyChar) {
            if (keyChar == ' ') {
                try {
                    highlighter.addHighlight(pos, pos+1, spaceHighlightPainter);
                }
                catch (BadLocationException e) {
                }
            }
            if (keyChar == '\n') {
                try {
                    highlighter.addHighlight(pos, pos+1, returnHighlightPainter);
                }
                catch (BadLocationException e) {
                }
            }
            if (keyChar == '\t') {
                try {
                    highlighter.addHighlight(pos, pos+1, tabsHighlightPainter);
                }
                catch (BadLocationException e) {
                }
            }
        }
        
        @Override
        public void changedUpdate(DocumentEvent evt) {}
        @Override
        public void removeUpdate(DocumentEvent evt) {}
        
    }
    
    class TabsHighlightPainter implements Highlighter.HighlightPainter {
        
        @Override
        public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
            TextUI mapper = c.getUI();
            try {
                Rectangle offs0 = mapper.modelToView(c, p0);
                Rectangle offs1 = mapper.modelToView(c, p1);
                Rectangle r = new Rectangle(offs0.x, offs0.y, offs1.x-offs0.x, offs0.height);
                g.setColor(Color.BLUE);
                g.drawLine(r.x, r.y+10, r.x+r.width-3, r.y+10);
                g.drawOval(r.x+r.width-6, r.y+8, 4, 4);
            }
            catch (BadLocationException e) {
            }
        }
        
    }
    
    class SpaceHighlightPainter implements Highlighter.HighlightPainter {
        
        @Override
        public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
            TextUI mapper = c.getUI();
            try {
                System.out.println(p0);
                System.out.println(p1);
                Rectangle offs0 = mapper.modelToView(c, p0);
                Rectangle offs1 = mapper.modelToView(c, p1);
                Rectangle r = new Rectangle(offs0.x, offs0.y, offs1.x-offs0.x, offs0.height);
                g.setColor(Color.RED);
                g.fillOval(r.x+2, r.y+9, 3, 3);
            }
            catch (BadLocationException e) {
            }
        }
        
    }
    
    class ReturnHighlightPainter implements Highlighter.HighlightPainter {
        
        @Override
        public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
            TextUI mapper = c.getUI();
            try {
                Rectangle offs0 = mapper.modelToView(c, p0);
                Rectangle r = new Rectangle(offs0.x, offs0.y, 10, offs0.height);
                g.setColor(Color.GREEN);
                g.drawString("\\n", r.x+1, r.y+r.height-4);
            }
            catch (BadLocationException e) {
            }
        }
        
    }
    
}



вроде бы работает при анализе текста целиком, но при попытке анализа и рисования при вводе символов какая-то ерунда происходит. :(

и все же может есть другой способ, а то этот как-то не особо катит :/
PM   Вверх
dorogoyIV
Дата 21.3.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(philips @  21.3.2008,  21:22 Найти цитируемый пост)
и все же может есть другой способ, а то этот как-то не особо катит :/

ну тебя же предупреждали  smile 
проще заменить... вот например - "\u00B6" - это знак абзаца
PM MAIL   Вверх
philips
Дата 23.3.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



может можно как-то переопределить как должен рисоваться тот или иной символ??  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.2384 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.