Swing文本API:用不同的字符串长度覆盖LabelView?

时间:2013-11-22 18:12:32

标签: java swing text view jtextpane

我有一个StyledDocument实例,其中包含代表数字的字符串。通过覆盖字符串元素的属性,我正在使用我从LabelView派生的自定义视图。我想允许用户选择所显示号码的基数,例如十进制或十六进制。这是我目前的解决方案:

public class AddressView extends LabelView {
    @Override
    public Segment getText(int p0, int p1) {
        // get string representation of the number from the model
        String stringNumber = super.getText(p0, p1).toString();

        // get base from document's attributes
        int base = getDocument().getProperty(BaseProperty);

        // convert string to desired base
        String stringNumberOverride = Integer.toString(Integer.parseInt(stringNumber), base);

        // return as segment (can have a different length, JTextPane doesn't like that)
        char[] strNum = stringNumberOverride.toCharArray();
        return new Segment(strNum, 0, strNum.length);
    }
}

只有一个问题:选择文本不再起作用,因为返回的getText字符串没有请求的长度(p1 - p0)。实现JTextPane组件以准确选择那么多个字符,因此使用上述解决方案,用户只能选择p1-p0字符,即使新基本可能在模型中显示了数字字符串的更长字符串表示。

那么,让View显示一个与模型中的String长度不同的String的正确方法是什么?我不想仅仅因为用户需要不同的内容表示来更新模型。

编辑:这是一个独立的例子。尝试选择文本 - 您只能选择所有字符或不选择字符,因为模型中只有一个字符。

package mini;

import javax.swing.*;
import javax.swing.text.*;

public class Mini extends JFrame {
    public Mini() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JTextPane pane = new JTextPane();
        pane.setEditorKit(new MyEditorKit());
        add(new JScrollPane(pane));
        pack();
    }

    public static void main(String[] args) {
        Mini mini = new Mini();
        mini.setVisible(true);
    }
}

class MyEditorKit extends StyledEditorKit {
    @Override
    public ViewFactory getViewFactory() {
        return new ViewFactory() {
            public View create(Element elem) {
                return new MyView(elem);
            }
        };
    }
}

class MyView extends LabelView {
    public MyView(Element elem) {
        super(elem);
    }

    @Override
    public Segment getText(int p0, int p1) {
        String line = "Displayed text that's longer than model text";
        return new Segment(line.toCharArray(), 0, line.length());
    }
}

1 个答案:

答案 0 :(得分:0)

有几种可能的解决方法。

  1. 您可以为添加的数字定义更大的字符串吗?空格总是有相同长度的文字?例如。你有1-100的数字,所以在之前或之后追加空格总是有3个字符。

  2. 如果您只是需要更改渲染,请保留所有reas原样。您可以覆盖

    public void paint(Graphics g,Shape a)

  3. 方法并使用g.drawString()呈现所需的文字。您可以从文档的方法public Font getFont(AttributeSet attr)设置字体。问题是如何处理数字中的大小更改和插入符号导航,但也可以克服。