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

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык Java

Для написания примитивных текстовых редакторов чаще всего используются такие компоненты как 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();
}

}

Рисунок 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();

}

}

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

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

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

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

Источник: http://www.javaportal.ru/java/articles/JTextPane.html
Автор: Загребин Виктор Александрович

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты