11

所以我正在处理我的java项目并且在程序的一部分中我正在打印文本文本显示在左侧但是我希望它显示在中间我完成了多少?这是一个新手问题吗?

例子:

public static void main(String[] args)
{
System.out.println("Hello");
}
4

7 回答 7

10

非常快速的回答

您可以使用 JavaCurses 库在控制台上做一些有趣的事情。请阅读下面的内容。

在你这样做之前,让我们在某些情况下回答你的整个问题

这是一个新手问题:) 但这是一个有效的问题。所以给你一些提示:

第一个问题是,终端有多宽?(以字符数计算)旧终端的固定尺寸为 80 个字符和 25 行;

因此,首先假设它有 80 个字符宽。

如何在 80 个字符宽的终端屏幕上居中显示字符串?

你需要担心字符串的长度吗?你如何水平放置东西?你加空格吗?你能想出一个格式字符串吗?

一旦你编写了一个程序,你可以给它任何可以在这些假设下正确显示的字符串(那个终端是 80 个字符宽),你现在可以开始担心如果你连接到一个或多或少的终端会发生什么超过 80 个字符?或者您是否连接到终端。例如,如果您不是,那么“美化”您的代码是否有意义?可能不是。

所以问题是你如何获得所有这些信息?

您所要求的是将控制台视为具有基于字符的控制功能的智能电传 (tty) 终端的能力。旧的电传终端可以做很多有趣的事情。

一些历史

电传终端是复杂的东西,来自于许多终端制造商(IBM、DEC 等)的遗留问题......这些电传终端的开发是为了解决许多问题,例如能够从大型机和小型计算机远程显示内容.

有一堆终端标准 vt100、vt200、vt220、ansi,它们出现在终端开发历史的各个阶段,并且沿途有数百个专有标准。

这些终端可以定位光标、窗口和颜色、突出显示文本、下划线等,但不是每个人都能做所有事情。然而,这是使用“控制”字符完成的。ctrl-l 在 ansi 和 vt 终端上是清晰的屏幕,但它可能是其他东西的页面馈送。

如果您编写了一个特定于某个程序的程序,那么在其他地方将毫无意义。因此,将其简化的必要性导致开发了几个抽象库来隐藏丑陋。

第一个称为 termcap(终端功能)库,大约在 1978 年,它提供了一种在 UNIX 系统上处理终端的通用方法。它可以告诉正在运行的程序终端的可用功能(例如更改文本颜色的能力)或将光标定位在某个位置,或清除自身等,然后程序将相应地修改其行为。

第二个库称为 curses,大约在 1985 年(??)它是作为 BSD 系统的一部分开发的,用于编写游戏......这个库的最受欢迎的版本之一是 GNU curses 库(以前称为 ncurses )。

在 VMS 上,我相信该库称为 SMG$(屏幕管理库)。

继续回答

无论如何,您可以在 java 中使用这些库之一来确定您是否在正确的终端上工作。source forge 上有一个名为JavaCurses的库,它为 Java 程序提供了这种能力。这将是一个学习如何在程序中使用新库的练习,应该会令人兴奋。

JavaCurses 在 Unix 和 Windows 环境中提供终端编程能力。这将是一个有趣的练习,看看你是否可以用它来玩。

进阶练习

另一个练习是使用同一个库来查看您是否可以创建一个在终端上很好地显示的程序,并且还可以在没有终端代码的情况下写入文本文件;

如果您有任何问题,请发布,我会在您进行时提供帮助。

于 2013-05-18T22:49:38.230 回答
2

如果您有明确的行长,apache commonsStringUtils.center将轻松完成这项工作。但是,您必须添加该库。文档

于 2013-05-18T22:18:42.757 回答
1

您可以执行以下操作:

public static void main(String[] args) {
    String h = "Hello";

    System.out.println(String.format("%-20s", h));
}

这种方法输出一个给定空格数的字符串偏移量。在这种情况下Hello,前面有 20 个空格。空格在前面,因为和Hello之间的整数是负数,否则空格会在尾随。%s

只需弄乱 和 之间的整数%s直到获得所需的结果。

于 2013-05-18T22:18:03.800 回答
1

控制台的 Java 打印语句不能居中,因为行没有最大宽度。

例如,如果您的控制台限制为 80 个字符,您可以编写一个特殊的记录器,用空格填充字符串。

如果您的字符串大于 80 个字符,那么您将不得不剪切字符串并在下一行打印剩余部分。此外,如果其他人将您的应用程序与具有不同宽度(尤其是更小)的控制台一起使用,则看起来会很奇怪。

所以基本上,不,没有简单的方法可以使输出居中......

于 2013-05-18T22:20:17.350 回答
0

你不能。您正在写入没有宽度的控制台,因此中心未定义。

于 2013-05-18T22:14:28.387 回答
0

如果您知道大小并且不想使用外部库,则可以执行以下操作:

static void printer(String str, int size) {
    int left = (size - str.length()) / 2;
    int right = size - left - str.length();
    String repeatedChar = "-";
    StringBuffer buff = new StringBuffer();
    for (int i = 0; i < left; i++) {
        buff.append(repeatedChar);
    }
    buff.append(str);
    for (int i = 0; i < right; i++) {
        buff.append(repeatedChar);
    }
    // to see the end (and debug) if using spaces as repeatedChar
    //buff.append("$");  
    System.out.println(buff.toString());
}

// testing:

printer("string", 30);

// output:
// ------------string------------

如果你用变量的奇数调用它size,那么它会-在右边再加一个。您可以将 更改repeatedChar为空格。

编辑

如果您只想打印一个char并且知道大小,则可以使用默认值System.out.printf,如下所示:

int size = 10;
int left = size/2;
int right = size - left;
String format = "%" + left + "c%-" + right + "c";
// would produce: "%5c%-5c"
System.out.printf(format,' ', '#');
// output: "     #    " (without the quotes)

将字符%-5c对齐#到分配给它的 5 个空格的左侧

于 2014-11-06T05:00:10.550 回答
0

很多编程问题,不要重新发明轮子!

Apache 有一个不错的库:带有 StringUtils 类的“org.apache.commons”:

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

pad方法是你想要的:

int w = 20;

System.out.println(StringUtils.rightPad("+", w - 1, "-") + "+");
System.out.println(StringUtils.center(StringUtils.center("output", w - 2), w, "|"));
System.out.println(StringUtils.rightPad("+", w - 1, "-") + "+");

会给你:

+----------------------+
|        output        |
+----------------------+
于 2018-11-14T09:07:44.597 回答