使用Java 7在JTextPane中使用样式文本进行奇怪的文本包装 [英] Strange text wrapping with styled text in JTextPane with Java 7

查看:109
本文介绍了使用Java 7在JTextPane中使用样式文本进行奇怪的文本包装的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个不同的编辑器使用JTextPane和Java 7中的奇怪错误,这些错误在以前的JVM版本中没有出现。它出现在包含样式文本或组件的长行中。



这是一个演示此错误的示例。在此示例中,每次插入字符时,都会对所有文本应用默认样式。我用JDK 1.7.0_04测试了它。

  import java.awt.BorderLayout; 
import javax.swing。*;
import javax.swing.event。*;
import javax.swing.text。*;

公共类BugWrapJava7扩展了JFrame {

JTextPane jtp;
StyledDocument doc;

public BugWrapJava7(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
jtp = new JTextPane();
add(jtp,BorderLayout.CENTER);
jtp.setText(\\\
type上面空行中的一些文字并检查包装行为);
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(){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
Style defaultStyle = jtp.getStyle(StyleContext .DEFAULT_STYLE);
doc.setCharacterAttributes(0,doc.getLength(),defaultStyle,false);
}
});
}
public static void main(String [] args){
new BugWrapJava7();
}
}

我的问题是:我的代码中有什么问题,还是它确实是Java 7中引入的新bug?如果它是一个新的JVM错误,是否有解决方法?



它可能与问题8666727 ,但问题在于错误的包装而不是滚动条的外观。

解决方案

对于期货读者, JDK 1.7.0_04中仍存在错误。,<比较Java7和稳定的Java6,

$ b

< ------ Java7 vs Java6 --->



< ------ Java7 vs Java6 --->



< ------ Java7 vs Java6 --->



< ------ Java7 vs Java6 --->



来自代码

  import java.awt.Dimension; 
import javax.swing。*;
import javax.swing.event。*;
import javax.swing.text。*;

公共类BugWrapJava7 {

private JFrame frame = new JFrame();
private JTextPane jtp;
私有StyledDocument doc;

public BugWrapJava7(){
jtp = new JTextPane();
jtp.setText(\\\
type上面空行中的一些文字并检查包装行为);
doc = jtp.getStyledDocument();
doc.addDocumentListener(new DocumentListener(){

public void insertUpdate(DocumentEvent e){
insert();
}

public void removeUpdate(DocumentEvent e){
insert();
}

public void changedUpdate(DocumentEvent e){
insert();
}

public void insert(){
SwingUtilities.invokeLater(new Runnable(){

public void run(){
Style defaultStyle = jtp。 getStyle(StyleContext.DEFAULT_STYLE);
doc.setCharacterAttributes(0,doc.getLength(),defaultStyle,false);
}
});
}
} );
JScrollPane scroll = new JScrollPane(jtp);
scroll.setPreferredSize(new Dimension(200,200));
frame.add(scroll);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}

public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable(){

public void run() {
BugWrapJava7 bugWrapJava7 = new BugWrapJava7();
}
});
}
}


I have two different editors using JTextPane with strange bugs in Java 7 that did not occur with the previous JVM versions. It happens with long lines containing styled text or components.

Here is an example demonstrating this bug. In this example, the default style is applied for all the text each time a character is inserted. I tested it with the 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() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Style defaultStyle = jtp.getStyle(StyleContext.DEFAULT_STYLE);
                doc.setCharacterAttributes(0, doc.getLength(), defaultStyle, false);
            }
        });
    }
    public static void main(String[] args) {
        new BugWrapJava7();
    }
}

My question is : is there something wrong in my code, or is it indeed a new bug introduced in Java 7 ? And if it is a new JVM bug, is there a workaround ?

It might be related to question 8666727, but the problem here lies in the wrong wrapping rather than the appearance of a scrollbar.

解决方案

for futures readers, bug is still present in JDK 1.7.0_04.,

comparing Java7 and with stable Java6,

<------ Java7 v.s. Java6 --->

<------ Java7 v.s. Java6 --->

<------ Java7 v.s. Java6 --->

<------ Java7 v.s. Java6 --->

from code

import java.awt.Dimension;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class BugWrapJava7 {

    private JFrame frame = new JFrame();
    private JTextPane jtp;
    private StyledDocument doc;

    public BugWrapJava7() {
        jtp = new JTextPane();
        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) {
                insert();
            }

            public void changedUpdate(DocumentEvent e) {
                insert();
            }

            public void insert() {
                SwingUtilities.invokeLater(new Runnable() {

                    public void run() {
                        Style defaultStyle = jtp.getStyle(StyleContext.DEFAULT_STYLE);
                        doc.setCharacterAttributes(0, doc.getLength(), defaultStyle, false);
                    }
                });
            }
        });
        JScrollPane scroll = new JScrollPane(jtp);
        scroll.setPreferredSize(new Dimension(200, 200));
        frame.add(scroll);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                BugWrapJava7 bugWrapJava7 = new BugWrapJava7();
            }
        });
    }
}

这篇关于使用Java 7在JTextPane中使用样式文本进行奇怪的文本包装的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆