Как избежать перенос в JTextPane. Java JDK 1.5
Для написания примитивных текстовых редакторов чаще всего используются такие компоненты как JEditorPane
, JTextPane
и JTextArea
. В отличие от JTextArea
компоненты JEditorPane
и JTextPane
способны поддерживать работу со стилизированным текстом. JTextArea
не позволяет использовать стилизированный цветной текст, но позволяет управлять переносом с помощью метода setLineWrap(boolean wrap)
.
JTextPane
является производным классом от JEditorPane
и имеет массу встроенных методов для работы со стилизированным текстом. Но недостаток этого компонента в том, что по умолчанию производится автоматический перенос в рамках видимой области. Это продемонстрировано в следующей программе JTextPaneDemo1.java
и на рис. 1.
/**
* @author <a; href="mailto:[email protected]"> 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:[email protected]"> 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 эти проблемы не встречались.
Ссылки
- Форум: Sun Microsystems, раздел: Swing, тема: JTextPane: how to avoid wrap?
http://www.java.sun.com - Форум: Juga_Ru, раздел: Java для каждого, тема: Как сделать JtextArea цветным…?
http://forum.juga.ru