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


Автор: philips 21.3.2008, 21:36
в общем, для JTextPane нужно реализовать методы setTabSize, setLineWrap, аналогичные как у JTextArea. 

также как можно сделать сбоку панельку с номерами строк??

заранее спс..

Автор: dorogoyIV 21.3.2008, 21:49
Цитата(philips @  21.3.2008,  21:36 Найти цитируемый пост)
как можно сделать сбоку панельку с номерами строк??

вы вообще то знакомы с массивами?

Автор: philips 21.3.2008, 22:59
Цитата

вы вообще то знакомы с массивами? 


а поподробнее можно, пжлста?? куда и как тут массивы прикрутить??

Автор: dorogoyIV 21.3.2008, 23:38
Цитата(philips @  21.3.2008,  22:59 Найти цитируемый пост)
а поподробнее можно, пжлста?? куда и как тут массивы прикрутить??

ну как же?

Цитата(philips @  21.3.2008,  21:36 Найти цитируемый пост)
также как можно сделать сбоку панельку с номерами строк??

нужно знать количество строк, ну и там дальше реализовывать... я не могу сказать как именно, потому, что много, очень много вариантов...
примерно: (примерно!!!, я даже не знаю, есть ли метод getRowCount() у JTextPane, мне лень посмотреть  smile )
Код

int row_count=jTextPane.getRowCount();
for(int i=0; i < row_count; i++)
{
 ...
}

Автор: philips 21.3.2008, 23:55
хм... так эт понятно.. 
подскажи лучше как связать именно JTextPane с этой панелькой с цифрами, чтоб при прокрутке текстовой области в JScrollPane эта панелька тоже прокручивалась.

Автор: dorogoyIV 22.3.2008, 05:17
ну вот один из вариантов, хотя тут можно много нафантазировать  smile 
Код

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

public class MyTextPane extends JTextPane
                        implements Runnable
{
 public MyTextPane()
 {
  new Thread(this).start();
 }

 public void appendText(String text)
 {
  try
  {
   Document doc=getDocument();
   setCaretPosition(doc.getLength());
   replaceSelection(text);
   Rectangle r=modelToView(doc.getLength());
   if(r != null)
     scrollRectToVisible(r);
  }
  catch(Exception ex){}
 }

 public void run()
 {
  try
  {
   BufferedReader br=new BufferedReader(
                     new FileReader("Base.txt"));
   String s="";
   int i=0;

   while((s=br.readLine()) != null)
   {
    Thread.currentThread().sleep(1000);
    appendText(i++ + " " + s + "\n");
   }
  }
  catch(Exception ex){}
 }

 public static void main(String[] args)
 {
  JFrame f = new JFrame();
  f.add(new JScrollPane(new MyTextPane()));
  f.setBounds(100, 100, 300, 200);
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

Автор: philips 22.3.2008, 18:22
так..

по поводу номеров линий вопрос снимается. 
прикрепил область с цифрами в JScrollPane как setRowHeaderView. а отображение цифр это было уже делом техники.  smile

а вот вопросы про размер таба и переноса слов остаются ОТКРЫТЫМИ!

Автор: Kangaroo 22.3.2008, 18:52
Цитата(philips @  21.3.2008,  20:36 Найти цитируемый пост)
в общем, для JTextPane нужно реализовать методы setTabSize, setLineWrap, аналогичные как у JTextArea. 

А если посмотреть как они сделаны в JTextArea?

Автор: philips 22.3.2008, 23:12
там все не так просто :/

вот метод

JТехтАреа.class :
Код

public void setTabSize(int size) {
        Document doc = getDocument();
        if (doc != null) {
            int old = getTabSize();
            doc.putProperty(PlainDocument.tabSizeAttribute, new Integer(size));
            firePropertyChange("tabSize", old, size);
        }
    }


Component.class :
Код

protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        PropertyChangeSupport changeSupport = this.changeSupport;
        if (changeSupport == null ||
            (oldValue != null && newValue != null && oldValue.equals(newValue))) {
            return;
        }
        changeSupport.firePropertyChange(propertyName, oldValue, newValue);
    }


BasicTextAreaUI.java :
Код

protected void propertyChange(PropertyChangeEvent evt) {
        super.propertyChange(evt);
    if (evt.getPropertyName().equals("lineWrap") ||
        evt.getPropertyName().equals("wrapStyleWord") ||
        evt.getPropertyName().equals("tabSize")) {
        // rebuild the view
        modelChanged();
    } else if ("editable".equals(evt.getPropertyName())) {
        updateFocusTraversalKeys();
    }
    }


BasicTextUI.class :
Код

protected void modelChanged() {
        // create a view hierarchy
        ViewFactory f = rootView.getViewFactory();
        Document doc = editor.getDocument();
        Element elem = doc.getDefaultRootElement();
        setView(f.create(elem));
    }


у LineWrap аналогично

даж не знаю что делать :/

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