Java 如何在SWT文本小部件中显示不可打印的字符

Java 如何在SWT文本小部件中显示不可打印的字符,java,eclipse,swt,control-characters,styledtext,Java,Eclipse,Swt,Control Characters,Styledtext,在SWT StyledText小部件中显示不可打印的字符是如何实现的,就像用一个空方块Swing一样 通过源字符串中的正则表达式用符号替换所有出现的情况不能成为解决方案,因为无法再使用原始代码点进行复制和粘贴 最好的方法可能是拦截文本渲染并在那里替换它们,但这似乎打开了潘多拉的盒子 编辑1: 控制字符,它的全部内容,是通常被跳过的字符,而不是编辑器显示的字符,比如HOP(U+0081)对于E4 RCP应用程序,我附带了一些代码 基本上是使用IEventBroker通过按钮添加/删除TextVie

在SWT StyledText小部件中显示不可打印的字符是如何实现的,就像用一个空方块Swing一样

通过源字符串中的正则表达式用符号替换所有出现的情况不能成为解决方案,因为无法再使用原始代码点进行复制和粘贴

最好的方法可能是拦截文本渲染并在那里替换它们,但这似乎打开了潘多拉的盒子

编辑1:


控制字符,它的全部内容,是通常被跳过的字符,而不是编辑器显示的字符,比如HOP(U+0081)

对于E4 RCP应用程序,我附带了一些代码

基本上是使用IEventBroker通过按钮添加/删除TextViewer的画师

StyledText可从以下位置获得:

styledText = tv.getTextWidget();
如上所述

import org.eclipse.jface.text.WhitespaceCharacterPainter;
public class TheEditor{
    @Inject MPart thePart;
    private WhitespaceCharacterPainter whitespaceCharacterPainter;

    @PostConstruct
    public void postConstruct(Composite parent) {
            TextViewer tv = new TextViewer(parent, SWT.MULTI | SWT.V_SCROLL |SWT.H_SCROLL);
            whitespaceCharacterPainter = new  WhitespaceCharacterPainter(tv);
            tv.addPainter(whitespaceCharacterPainter);
            whitespaceCharacterPainter.deactivate(true);
    }

    @Inject
    @Optional
    public void updatePartByWSButton(@UIEventTopic(EventConstants.WHITE_CHARACTERS_STATUS) boolean newButtonStatus) {
        final MElementContainer<MUIElement>container = thePart.getParent();
        if (thePart.equals((MPart)container.getSelectedElement())){
            wsToolBarButtonStatus = newButtonStatus;
            if(wsToolBarButtonStatus){
              this.whitespaceCharacterPainter.paint(IPainter.CONFIGURATION);
            }
            else{
                whitespaceCharacterPainter.deactivate(true);
                tv.removePainter(whitespaceCharacterPainter);
            }
        }
    }
}
Contants接口:

public interface EventConstants {
    String WHITE_CHARACTERS_STATUS = "WHITE-CHARACTERS-STATUS";
}

对于E4 RCP应用程序,我附带了一些代码

基本上是使用IEventBroker通过按钮添加/删除TextViewer的画师

StyledText可从以下位置获得:

styledText = tv.getTextWidget();
如上所述

import org.eclipse.jface.text.WhitespaceCharacterPainter;
public class TheEditor{
    @Inject MPart thePart;
    private WhitespaceCharacterPainter whitespaceCharacterPainter;

    @PostConstruct
    public void postConstruct(Composite parent) {
            TextViewer tv = new TextViewer(parent, SWT.MULTI | SWT.V_SCROLL |SWT.H_SCROLL);
            whitespaceCharacterPainter = new  WhitespaceCharacterPainter(tv);
            tv.addPainter(whitespaceCharacterPainter);
            whitespaceCharacterPainter.deactivate(true);
    }

    @Inject
    @Optional
    public void updatePartByWSButton(@UIEventTopic(EventConstants.WHITE_CHARACTERS_STATUS) boolean newButtonStatus) {
        final MElementContainer<MUIElement>container = thePart.getParent();
        if (thePart.equals((MPart)container.getSelectedElement())){
            wsToolBarButtonStatus = newButtonStatus;
            if(wsToolBarButtonStatus){
              this.whitespaceCharacterPainter.paint(IPainter.CONFIGURATION);
            }
            else{
                whitespaceCharacterPainter.deactivate(true);
                tv.removePainter(whitespaceCharacterPainter);
            }
        }
    }
}
Contants接口:

public interface EventConstants {
    String WHITE_CHARACTERS_STATUS = "WHITE-CHARACTERS-STATUS";
}

扩展(并通过
TextViewer
使用
StyledText
小部件)怎么样?好主意!我将尝试一下……扩展(并通过
TextViewer
使用
StyledText
小部件)怎么样?好主意!我会尝试一下…谢谢你的代码片段!附加一个WhitespaceCharacterPainter并不是真正的重点。这是如何绘制通常只是在视图中删除的不可打印字符,如跳跃字符(U+0081)-可能通过扩展WhitespaceCharacterPainter的方式进行研究…感谢代码片段!附加一个WhitespaceCharacterPainter并不是真正的重点。这是如何绘制通常只是在视图中删除的不可打印字符,如跳跃字符(U+0081)-可能通过扩展WhitespaceCharacterPainter的方式进行研究。。。