【问题标题】:How to display tab with spaces?如何显示带有空格的选项卡?
【发布时间】:2016-12-07 02:21:19
【问题描述】:

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

每个字符都在自己的框架中,但是当涉及到制表符时,就会出现问题。我尝试用 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);
    }
}

【问题讨论】:

    标签: java swing tabs


    【解决方案1】:

    您可以检查制表符之前的字符串长度。

    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
    

    我用点来使空格的位置更清楚。

    【讨论】:

      【解决方案2】:

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

      只需使用JTextAreamonospaced Font。无需自定义绘画。

      JTextArea 甚至有一个方法可以让您控制给定选项卡的空格数。

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

      【讨论】:

        【解决方案3】:

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

        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;
        }
        

        【讨论】:

        • 是的。我有点惊讶它也有效。但确实如此:D
        猜你喜欢
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多