不知道火龙果有没有研究过 JtextArea 里自动折行的算法,或者给个你自己的思路也成,项目中用到这样的,我自己写的老感觉性能不好。
其他有知道的请不吝指教要求: 有一串字符串,给出一个宽度,然后根据这个宽度自动折行(单词尽可能多的放一起,考虑下当有十万,百万个字符串时,每个都需要折行,对性能的影响,这是关键)

解决方案 »

  1.   

    给JTextArea设置自动折行, 不用自己手动写的.JTextArea msgBox = new JextArea();
    msgBox.setLineWrap(true);具体要多少行, 你给JTextArea设定宽度就可以了.
      

  2.   

    错了,是具体一行要多少个字符,你给JTextArea设置一个宽度就可以了.
      

  3.   

    谢谢你的参与,不过我需要的是他的算法,我实际不是应用 JTextArea :)
      

  4.   

    写了个测试, 这个方法20万字符长度的字符串, 按二十的宽度加换行需要1621毫秒. 不知道合你要求不.
    另外, 那个循环的判断条件是个分页算法,没有仔细测, 如果和要求,你自己调调.
    package selfimpr.auto;public class AutoLineWrap { private static StringBuilder str = new StringBuilder();

    static {
    for(int i=0; i<200000; i++) {
    str.append("a");
    }
    }

    public static void main(String[] args) {

    long startTime = System.currentTimeMillis();

    int width = 20;

    for(int i=1; i<(str.length() + width)/width; i++) {
    str.insert(i * width - 1, "\n");
    }

    long endTime = System.currentTimeMillis();

    System.err.println("success in " + (endTime - startTime) + " millis" );
    }}
      

  5.   

    很不好意思,我不会使用 Swing,也没研究过 JTextArea 中自动拆行的方法。我比较笨,没看明白具体要做什么,不知道这个拆行跟 JTextArea 的关系大么?
      

  6.   

    不好意思,晚上回家上不了网,我举个例子描述下我的需求比如,
    例子一:现在有字符串 "abcdefg abc", 假定给的宽度只够放 "abcdefg ",那么最后的结果应该是|abcdefg |
    |abc     |例子二:现有一组字符串如下(宽度为 "abcdefg ",注意有空格)
    |abcdefg |
    |abcdefg |
    |abcdefg |
    那么,当我的宽度缩减变为 "abcd"时,我需要的结果就变为如下
    |abcd|
    |efg |
    |abcd|
    |efg |
    |abcd|
    |efg |例子三:考虑一个复杂的,现有一组字符串如下(宽度为"abcdefg")
    |a abcde|
    |a abcde|
    |a abcde|
    那么,当我的宽度缩减为 "abcde"时,需要的结果如下(保持单词的完整性)|a    |
    |abcde|
    |a    |
    |abcde|
    然后,当宽度缩减为 "abcd"时,需要的结果如下
    |a   |
    |abcd|
    |e   |
    |a   |
    |abcd|
    |e   |谢谢大家的关注,额外的,计算这些,可能需要涉及到计算字母,字符串的宽度public int computeCharsWidth(String s, Font  f)
    {
    FontRenderContext frc = new FontRenderContext(f.getTransform(), false, true);
    return (int)Math.round(f.getStringBounds(s,frc).getWidth());
    }
      

  7.   

    补充一下,我需要的效果,其实就是一个自动换行的功能,目前已有的算法似乎性能不是很好,所以想借鉴下其他的
    比如,用过 JTextArea 的朋友会知道,只需要调用它的setLineWrap(true);和setWrapStyleWord(true);那么就可以达到我需要的效果,不过我找了半天没找到它真正实现这个折行的算法
    类似的,比如记事本,office word 里都有自动换行的功能
      

  8.   

    Swing中文本的控制是在Swing.text包中实现的,在构建JTextArea的UI时,比如BasicTextAreaUI,根据其LineWrap的值,
    会使用WrappedPlainView或者PlainView
    每次更新文本内容,WrappedPlainView都会重新计算分行。
    请看LZ研究一下WrappedPlainView.update/breakLines/alculateBreakPosition这些方法吧另外,各位有时间,也请帮我看看我发的问题吧,谢谢了
    http://topic.csdn.net/u/20090217/22/258eb255-497a-4e31-96ed-a005a5dc3cf0.html
      

  9.   

    Swing中文本的控制是在Swing.text包中实现的,在构建JTextArea的UI时,比如BasicTextAreaUI,根据其LineWrap的值, 
    会使用WrappedPlainView或者PlainView 
    每次更新文本内容,WrappedPlainView都会重新计算分行。 
    请看LZ研究一下WrappedPlainView.update/breakLines/alculateBreakPosition这些方法吧 另外,各位有时间,也请帮我看看我发的问题吧,谢谢了

    http://topic.csdn.net/u/20090217/22/258eb255-497a-4e31-96ed-a005a5dc3cf0.html
      

  10.   

    既然你说JTextArea的折行算法可以,那你去看看JDK的源代码不就可以了?没找到源代码吗?