- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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 到 100 之间的数字,所以在前后附加空格以始终有 3 个字符。
如果您只需要更改渲染,请保持原样。你可以覆盖
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/
我有两个 LabelViews。添加到 View 中的文本大小可变。如何在不知道高度的情况下将第二个 LabelView 直接放在第一个 LabelView 的下方? 如果将第一个 LabelView
topLeftView: SC.ScrollView.design({ backgroundColor: "#DADFE6", childViews: 'labLabel labMem
以下是LabelView被定义为。无论是什么被设置,因为它的值也显示在点击它的警告框中。但是,只有警报框显示输出。: outputView: SC.LabelView.design({
我有stackView,其中包含很少的labelView,每个都写了两个单词。我希望它们在 labelView 的整个宽度上用省略号分隔。结果是:一个词靠近左边,另一个词靠近右边,它们之间是点。注意:
这个问题已经有答案了: UITextField text change event (22 个回答) 已关闭 7 年前。 我在textField中输入的内容如何立即在labelView中显示而无需按钮
任何人都可以告诉我,我在拖动和释放鼠标时使用 UIPangesture 获取了可拖动标签,我正在使用 找到触摸点 CGPoint touchPoint = [panGesture locationIn
我有一个 StyledDocument 实例,其中包含代表数字的字符串等。通过覆盖字符串元素的属性,我为它们使用了一个从 LabelView 派生的自定义 View 。我想让用户选择显示数字的基数,例
我尝试在 listView 中设计一个自定义 View 。 代码如下所示: Myapp.listView=SC.ScrollView.design({ layout: { centerX: 0,
我是一名优秀的程序员,十分优秀!