如何显示带空格的标签?

时间:2016-12-06 09:28:01

标签: java swing tabs

我有一个java程序,我从带有网格的JPanel上的文本文件中绘制每个字符(在它自己的框架中)。

left- JPanel, right- text document 每个角色都在自己的框架中,但是当涉及到标签时,就会出现问题。我尝试用8个空格替换所有标签,但问题是(如上图所示)它出现不一致,因为标签并不总是8个字符长。 有没有办法可以弄清楚标签使用了多少“空格”?或者有关如何获得与文本文件中相同布局的任何其他建议?

绘制文字的代码:

g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Font font = new Font("monospaced", Font.PLAIN, 18);
g2.setColor(Color.BLACK);
g2.setFont(font);
String lines[] = LabAgentComponent.PASTE.split("\\r?\\n");
for (int i=0; i<lines.length; i++) {
    for(int j=0; j<lines[i].length(); j++) {
        g2.drawString(Character.toString(lines[i].charAt(j)), j * gridSize, (i+1) * gridSize);
    }
}

3 个答案:

答案 0 :(得分:3)

您可以在标签前检查字符串的长度。

Al203情况下,那将是5.你的标签应该从8的下一个倍数开始,中间至少有1个空格。

这是一个可以帮助你的小班:

public class TabToSpaces
{
    public static void main(String[] args) {
        System.out.println(replaceTab("\tb", 8, "."));
        System.out.println(replaceTab("a\tb", 8, "."));
        System.out.println(replaceTab("abcdefg\th", 8, "."));
        System.out.println(replaceTab("abcdefgh\ti", 8, "."));
        System.out.println(replaceTab("a\tb\tc\td\te", 8, "."));
        System.out.println(replaceTab("ab\tb\tc\td\te", 8, "."));
    }

    private static String replaceTab(String string, int tabSize, String space) {
        Pattern pattern = Pattern.compile("\t");
        Matcher matcher = pattern.matcher(string);
        StringBuffer sb = new StringBuffer();
        int offset = 0;
        while (matcher.find()) {
            int beforeLength = matcher.start() + offset;
            int spacesNeeded = (int) (Math.ceil((beforeLength + 1.0) / tabSize) * tabSize) - beforeLength;
            offset += spacesNeeded - 1;
            String spaces = new String(new char[spacesNeeded]).replace("\0", space);
            matcher.appendReplacement(sb, spaces);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}

输出:

........b
a.......b
abcdefg.h
abcdefgh........i
a.......b.......c.......d.......e
ab......b.......c.......d.......e

我使用圆点使空间更清晰。

答案 1 :(得分:3)

  

或者有关如何获得与文本文件相同的布局的任何其他建议?

只需使用JTextAreamonospaced Font。无需定制绘画。

JTextArea甚至有一个方法可以控制给定标签的空格数。

JTextArea还有read(...)方法直接将文件读入文本区域。

答案 2 :(得分:1)

我想出了如何做我想做的事。这是代码:

public void changeTabs(){
    String lines[] = PASTE.split("\\r?\\n");
    String together="";
    for (int i=0; i<lines.length; i++){
        for(int j=0; j<lines[i].length(); j++){
            if(Character.toString(lines[i].charAt(j)).equals("\t")){
                int spaces= Math.abs((lines[i].indexOf("\t")%8)-8);
                String tab= ("%-"+spaces+"s");
                lines[i]=lines[i].replaceFirst("\t", String.format(tab, ""));
            }
        }
    }for (int i=0; i<lines.length; i++){
        together=together.concat(lines[i]+"\n");
    }
    PASTE=together;
}