我试图重新定义将在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);
}
}
结果:
请帮忙。
问题解决了。 我以错误的方式理解了Tabstop。 为了使用制表符后选项卡,需要的是将一些成员添加到选项卡列表中,每个成员都需要距离边距。
谢谢RealSkeptic。