JTextPane上的TabStop不起作用

时间:2017-01-30 09:26:06

标签: java user-interface

我试图重新定义将在JTextPane上显示的标签的大小。 第一个选项卡以正确的大小显示(我重新定义的那个),但第二个连续显示的是不同的大小(更像是空白)。我试图声明多个具有不同对齐的TabStop,但结果仍然相同

我扩展了DefaultStyledDocument类,因为我使用它的颜色是相同的单词,所以我的选项卡定义就在其中。

public class KeywordStyledDocument extends DefaultStyledDocument{
    private static final long serialVersionUID = 1L;
    private Style _defaultStyle;
    private AttributeSet sttSet;
    private StyleContext sContext;

    public KeywordStyledDocument(Style defaultStyle, StyleContext sContext_)
    {
        _defaultStyle = defaultStyle;
        sContext = sContext_;
    }

    public void insertString(int offset, String str, AttributeSet a) throws BadLocationException
    {
        setTabs();
        this.setParagraphAttributes(0, str.length(), sttSet, false);
        super.insertString(offset, str, a);
        refreshDocument();
    }

    private void setTabs()
    {
        TabStop[] tab = new TabStop[1];
        tab[0] = new TabStop(20, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE);
        /*
         * tab[1] = new TabStop(50, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE);
         * tab[2] = new TabStop(50, TabStop.ALIGN_CENTER, TabStop.LEAD_NONE);
         * tab[3] = new TabStop(50, TabStop.ALIGN_BAR, TabStop.LEAD_NONE);
         */
        TabSet tabset = new TabSet(tab);
        sttSet = sContext.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.TabSet, tabset);

    }

    public void remove(int offs, int len) throws BadLocationException
    {
        super.remove(offs, len);
        refreshDocument();
    }

    private synchronized void refreshDocument() throws BadLocationException
    {
        String text = getText(0, getLength());
        final List<HiliteWord> list = processWords(text);

        setCharacterAttributes(0, text.length(), _defaultStyle, true);
        for (HiliteWord word : list)
        {
            StyleConstants.setForeground(_defaultStyle, word.getColor());
            setCharacterAttributes(word.getPosition(), word.getWord().length(), _defaultStyle, true);
        }
    }

    private static List<HiliteWord> processWords(String content)
    {
        List<HiliteWord> hiliteWords = new ArrayList<HiliteWord>();
        int startPos = 0, endPos = 0;
        char[] data = content.toCharArray();
        String newWord = "";

        for (int index = 0; index < data.length; index++)
        {
            if(data[index] == '<')
            {
                if(data[index + 1] == '/')
                {
                    startPos = index + 2;
                    hiliteWords.add(new HiliteWord("</", index, Color.BLUE));
                }else
                {
                    startPos = index + 1;
                    hiliteWords.add(new HiliteWord("<", index, Color.BLUE));
                }
            }

            if(data[index] == '>')
            {
                hiliteWords.add(new HiliteWord(">", index, Color.BLUE));

                endPos = index;
                newWord = content.substring(startPos, endPos);
            }

            if(!newWord.equals(""))
            {
                hiliteWords.add(new HiliteWord(newWord, startPos, Color.RED));
                newWord = "";
            }
        }
        return hiliteWords;
    }}

使用文本调用文本格式化程序:

private void createTabs() throws BadLocationException
{
    for (LRT057Data data : GUI.getArrayOfLRT057())
    {
         JEditorPane editorPane=new JEditorPane();
            editorPane.setEditorKit(new XMLEditorKit());

        KeywordStyledDocument ksd;
        StyleContext sc = StyleContext.getDefaultStyleContext();
        Style style = sc.addStyle("ConstantWidth", null);

        ksd = new KeywordStyledDocument(style, sc);
        ksd.insertString(0, "\tOne Tab\nNo Tab\n\t\tTwo Tabs\n\t\t\tThree Tabs", style);

        JTextPane pane = new JTextPane(ksd);     
        pane.setFont(new Font("Courier New", Font.PLAIN, 12));

        JComponent panel = new JScrollPane(pane);
        panel.setAutoscrolls(true);
        listener.addKeyAdapter(pane);
        tabs.addTab(data.getSystemName(), panel);
    }
}

结果:

not expected reslt

请帮忙。

问题解决了。 我以错误的方式理解了Tabstop。 为了使用制表符后选项卡,需要的是将一些成员添加到选项卡列表中,每个成员都需要距离边距。

谢谢RealSkeptic。

0 个答案:

没有答案