我有两个不同的编辑器使用JTextPane和Java 7中的奇怪错误,这些错误在以前的JVM版本中没有出现.它发生在包含样式文本或组件的长行中.
这是一个演示此错误的示例.在此示例中,每次插入字符时,都会对所有文本应用默认样式.我用JDK 1.7.0_04测试了它.
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class BugWrapJava7 extends JFrame {
JTextPane jtp;
StyledDocument doc;
public BugWrapJava7() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
jtp = new JTextPane();
add(jtp, BorderLayout.CENTER);
jtp.setText("\ntype some text in the above empty line and check the wrapping behavior");
doc = jtp.getStyledDocument();
doc.addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
insert();
}
public void removeUpdate(DocumentEvent e) {
}
public void changedUpdate(DocumentEvent e) {
}
});
setSize(200, 200);
setVisible(true);
}
public void insert() …Run Code Online (Sandbox Code Playgroud) 如何在JTextPane中实现自动换行?
我试图准确理解它是如何工作的,以便我可以修改行为.现在,如果我在JScrollPane中有一个标准的JTextPane,它会在空格处中断文本,但不会在长单词内部 - 如果有一个文本字符串没有比窗口宽的空格,它将不会换行/中断将出现一个水平滚动条.随着文本宽度的增加,ParagraphView的宽度(通过getWidth())会增加以保存文本.
Lapitsky的这篇文章说LabelView.getBreakWeight()返回带有空格的标签的View.ExcellentBreakWeight和没有空格的标签的View.GoodBreakWeight(GlyphView.java中的代码似乎证实了这一点),为什么它不会破坏?它是以某种方式返回BadBreakWeight而不是GoodBreakWeight?还是有一些布局问题?还是有错误?
这是一些代码(为了您的观看乐趣):
//somewhere inside JPanel or JFrame constructor
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane(textPane);
add(scrollPane);
Run Code Online (Sandbox Code Playgroud)
请注意,如果我取出滚动窗格并仅使用文本窗格(它只是在窗口外面时被剪切),它仍然不会换行.
Swing的javadoc似乎没有详细介绍一些对象(如JTextPane,View和相关对象)如何协同工作.是否还有关于此类课程设计的进一步文档,或许详细说明了每个课程的目的以及它们如何一起工作?它不公开吗?(或者我是唯一一个在这样的事情上遇到麻烦的人?或者说文档不足以限制一些典型的开发人员不会处理的事情?)
我有固定的列宽,需要使用apache POI自动调整行高,但我找不到它的工作决定。我尝试过这个决定,但它不适用于此文本
Lorem ipsum dolor sat amet,consectetur adipiscing elit,sed do eiusmod tempor incididunt ut laboure et dolore magna aliqua
列宽为33.00(236 像素),表格中的单元格具有换行文本属性。仅当内容高度大于现有行高度时,我才能更改行高度。
那么,我想问是否有任何方法或决定可以按内容自动调整行高?
private float calculateRowLinesForText(Font cellFont, float columnWidthInPoints, String value) {
java.awt.Font currFont = new java.awt.Font(cellFont.getFontName(), 0, cellFont.getFontHeightInPoints());
FontRenderContext frc = new FontRenderContext(null, true, true);
int lineCnt = 0;
for (String partValue : value.split("\n")) {
AttributedString attrStr = new AttributedString(partValue);
attrStr.addAttribute(TextAttribute.FONT, currFont);
LineBreakMeasurer measurer = new LineBreakMeasurer(attrStr.getIterator(), frc);
while (measurer.getPosition() < partValue.length()) …Run Code Online (Sandbox Code Playgroud)