gpt4 book ai didi

java - Swing 文本 API : Override LabelView with different string length?

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:44 26 4
gpt4 key购买 nike

我有一个 StyledDocument 实例,其中包含代表数字的字符串等。通过覆盖字符串元素的属性,我为它们使用了一个从 LabelView 派生的自定义 View 。我想让用户选择显示数字的基数,例如十进制或十六进制。这是我目前的解决方案:

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 显示与模型中的长度不同的字符串的正确方法是什么?我不想仅仅因为用户需要不同的内容表示而更新模型。

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

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. 你能为添加的数字定义更大的字符串吗?空格始终具有相等的文本长度?例如。你有 1 到 100 之间的数字,所以在前后附加空格以始终有 3 个字符。

  2. 如果您只需要更改渲染,请保持原样。你可以覆盖

    public void paint(Graphics g, Shape a)

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

关于java - Swing 文本 API : Override LabelView with different string length?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com