在最多6个Java的所有版本中,放置在JScrollPane中的JTextPane的默认行为是:如果可能,在字边界处换行.如果没有,那么无论如何都要包装它们.
在JDK 7中,默认行为似乎是:如果可能,在字边界处换行.如果没有,只需扩展JTextPane的宽度(永远不要换长字).
这很容易重现,这是一个SSCCE:
public class WrappingTest extends JFrame
{
public static void main ( String[] args )
{
new WrappingTest();
}
public WrappingTest ()
{
setSize(200,200);
getContentPane().setLayout(new BorderLayout());
JTextPane jtp = new JTextPane();
JScrollPane jsp = new JScrollPane(jtp);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(jsp,BorderLayout.CENTER);
setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
只需在JDK 6和JDK 7中运行它,写一些小字,然后写一个长字,你就会看到差异.
我的问题很简单...... JDK 7中的新默认行为完全混淆了我的程序(他们应该更加小心Oracle更改这种默认值......它们似乎并不重要但是当你使用JTextPane显示时通常包含非常长的字母串的数据,它们并不是那么不重要 - 实际上我要提交错误报告,但是我想在/如果它们不解决它的情况下有一个解决方法).有什么方法可以回到以前的行为?
请注意,我已经检查了相关问题的答案.如何在JTextPane中实现自动换行,以及如何使其包装不带空格的字符串?但是它没有回答这个问题 - 它提供了一种使JTextPane包装完全不考虑空白的方法,但对我来说,如果可能的话,所需的行为是在空白处分割行,如果不可能的话,在其他地方(如以前的Java)版本).
我最近注意到,自从我更新到Java 7以来,我的代码的特定部分运行速度明显变慢.令人惊讶的是,Java 7的全局速度比Java 6快.
该程序非常庞大,但我成功地提取了一个可重现的代码来演示java 7如何比Java 6慢.
如果您使用Java 6和Java 7运行完全相同的代码,您会发现Java 7比Java 6慢大约7-8倍!
这是代码(不要试图理解它的作用,它只是来自真实代码的摘要,因此并没有真正意义).它基本上是一个解析字符串以格式化其中某些部分的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
public class CPerfJava7 extends JFrame {
private static final long serialVersionUID = 1L;
// +==============================================================+
// | Attributes |
// +==============================================================+
JPanel mainPanel;
public CPseudoHtmlDocument docu;
private static long totalTime = …Run Code Online (Sandbox Code Playgroud) 我想为用户创建一个大文本字段来输入内容.我还希望它使用默认的系统字体来匹配预期的外观.所以我尝试使用JEditorPane和默认构造函数,它使用纯文本编码.
JEditorPane editorPane = new JEditorPane();
editorPane.setText(gettysburgAddress);
Run Code Online (Sandbox Code Playgroud)

这样做的问题在于,纯文本编码不会在每个单词的末尾换行到换行符,只有当它用完字符时才会换行.
我尝试使用HTML编码,这个词包装:
JEditorPane editorPane = new JEditorPane("text/html", "");
editorPane.setText(gettysburgAddress);
Run Code Online (Sandbox Code Playgroud)

这有自动换行,但它默认为不同于系统默认的字体(Mac OS X上的Helvetica,我不想要.
我怎样才能充分利用这两个方面:自动换行和系统默认字体?我不需要任何特殊的格式或任何东西,所以如果可能的话,纯文本编码将会做.
我遇到了一个奇怪的问题.我在JscrollPane中有一个JtextPane,它在分发列表中显示大字符串,并且在我使用eclipse运行程序时正确包装代码但是当我在使用java webstart运行相同程序时它停止包装文本.你能告诉我该怎么办.这是代码.
private JScrollPane displayResults(String distributionList) {
// TODO Auto-generated method stub
JTextPane textArea = new JTextPane();
textArea.setText(distributionList);
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize( new Dimension( 500, 500 ) );
return scrollPane;
}
Run Code Online (Sandbox Code Playgroud)
}
我正在制作类似于聊天的应用程序.为此,我有两个JTextPanes,一个是我正在编写的,一个是显示消息的.这是处理从输入到显示的文本传输的代码:
String input = textPane.getText();
if(!input.endsWith("\n")){
input+="\n";
}
StyledDocument doc = displayPane.getStyledDocument();
int offset = displayPane.getCaretPosition();
textPane.setText("");
try {
doc.insertString(offset, input, set);
} catch (BadLocationException ex) {
Logger.getLogger(ChatComponent.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我在输入文本的某些单词上有颜色,则输出都是彩色的.因此,当移动到显示时(在输入时正确显示),颜色将应用于所有文本.关于如何正确移动文本的任何建议?
请注意,其他格式与粗体,斜体等相同