Spiral group

_________________________________________________________________________________

 

< Раздел “Язык Java > < Раздел “Технологии Java > < Основная страница >

 

Как избежать перенос в JTextPane. Java JDK 1.5 .

         

 

Статья опубликована: 11.03.2005

Последнее изменение: 18.03.2007

 

 

Для написания примитивных текстовых редакторов чаще всего используются такие компоненты как JEditorPane, JTextPane и JTextArea. В отличие от JTextArea компоненты JEditorPane и JTextPane способны поддерживать работу со стилизированным текстом. JTextArea не позволяет использовать стилизированный цветной текст, но позволяет управлять переносом с помощью метода setLineWrap(boolean wrap).

JTextPane является производным классом от JEditorPane и имеет массу встроенных методов для работы со стилизированным текстом. Но недостаток этого компонента в том, что по умолчанию производится автоматический перенос в рамках видимой области. Это продемонстрировано в следующей программе JTextPaneDemo1.java и на рис. 1.

 

/**

 *  @author <a href="mailto:zagrebin_v@mail.ru"> Victor Zagrebin </a>.

 */

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.text.*;

public class JTextPaneDemo1 extends JFrame

{

 

 public void init() throws Exception

 {

  JFrame jf = new JFrame(JTextPaneDemo1”);

  Container contentPane = jf.getContentPane();

  JTextPane jtp = new JTextPane();

  JScrollPane jScrollPane1 = new JScrollPane();

  jScrollPane1.setBounds(new Rectangle(13, 16, 200, 100));

  jScrollPane1.getViewport().add(jtp);

  jf.setSize(200,100);

  contentPane.add(jScrollPane1);

  jf.setVisible(true);

 }

 

 public static void main(String args[]) throws Exception
     {
      JTextPaneDemo1 jc = new JTextPaneDemo1();
      jc.addWindowListener(new WindowAdapter()
      {
       public void windowClosing(WindowEvent e)
       {
        System.exit(0);
       }
      });

  jc.init();
     }

}

 

 

image3.gif

 

Рисунок 1 — Автоматический перенос в компоненте JTextPane

 

Первая проблема, с которой сталкивается программист – отсутствует горизонтальный скроллинг. Выставить принудительно появление горизонтального скроллинга не дает никаких результатов. В следующей программе JTextPaneDemo2.java показано как решается данная проблема. В JTextPane следует переопределить два метода setSize(Dimension d) и getScrollableTracksViewportWidth().

 

/**

 *  @author <a href="mailto:zagrebin_v@mail.ru"> Victor Zagrebin </a>.

 */

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.text.*;

import java.io.*;

 

public class JTextPaneDemo2 extends JFrame

{

 

 public void init() throws Exception

 {

  final int w = 649;

  final int h = 416;

  JTextPane textPane = new JTextPane();

  textPane = new JTextPane()

  {

   public void setSize(Dimension d)

   {

    if(d.width <= getParent().getSize().width)

    {

     d.width = getParent().getSize().width;

    }

    super.setSize(d);

   }

 

   public boolean getScrollableTracksViewportWidth()

   {

    return false;

   }

  };

 

  JFrame jf = new JFrame(“JTextPaneDemo2”);

  Container contentPane = jf.getContentPane();

  contentPane.setLayout(null);

  JScrollPane scrollPane = new JScrollPane();

  scrollPane.setBounds(new Rectangle(12, 12, w, h));

  scrollPane.getViewport().add(textPane);

  contentPane.add(scrollPane);

  jf.setSize(700,550);

  jf.setVisible(true);

 }

 

 public static void main(String args[]) throws Exception

 {

  JTextPaneDemo2 jc = new JTextPaneDemo2();

  jc.addWindowListener(new WindowAdapter()

  {

   public void windowClosing(WindowEvent e)

   {

    System.exit(0);

   }

  });

  jc.init();

 }

 

}

 

 

 

image4.gif

 

Рисунок 2 — Отмена автоматического переноса в компоненте JTextPane

 

Из рис. 2 видно как ликвидирован автоматический перенос. Однако этот метод принесет массу проблем, если использовать JSDK ниже весии 1.5. Среди этих проблем будут встречаться следующие:
         — автоперенос все равно будет срабатывать после набора нескольких тысяч символов;
         — копирование и многократная вставка длинных строк приведет к зависанию;
         — зона видимости может не соответствовать набранным символам.

В JSDK 1.5 эти проблемы не встречались.

 

Ссылки:

 

1. Форум: Sun Microsystems, раздел: Swing, тема: JTextPane: how to avoid wrap?

http://www.java.sun.com

2. Форум: Juga_Ru, раздел: Java для каждого, тема: Как сделать JtextArea цветным…?

http://forum.juga.ru

 

 

Автор:

 

 

Загребин Виктор Александрович

 

 

< Раздел “Язык Java > < Раздел “Технологии Java > < Основная страница >

 

Hosted by uCoz