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();
}
}
Рисунок 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 эти проблемы не встречались.
Ссылки:
1. Форум: Sun Microsystems, раздел: Swing, тема: JTextPane:
how to avoid wrap?
2. Форум: Juga_Ru, раздел: Java для каждого, тема: Как сделать JtextArea цветным…?
Автор: |
< Раздел “Язык Java” > < Раздел “Технологии Java” > < Основная страница >