擦除控制台文本 java
Erase console text java
我正在 java 制作 console chat program。它接受用户文本输入并发送到服务器,然后服务器将其广播给所有客户端。 我想清除用户在他的控制台上输入的文本。
我更喜欢平台无关的解决方案。
import java.io.*;
class Test
{
public static void main(String args[])
{
System.out.print("you: ");
String t=getString();
System.out.println("We accepted : " + t);
}
static String getString()
{
String s;
try{
BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
s = bufferRead.readLine();
//int count = 1;
//System.out.print(String.format("3[%dA",count)); // Move up
//System.out.print("3[2K"); // Erase line content, works on terminal but not on cmd
for(int i=0;i<s.length();i++)
System.out.print("\b"); //dont know, why it doesnt works??
}
catch(IOException e)
{e.printStackTrace(); s="Error";}
return s;
}
}
这是我对你的问题的解释:
我是客户,我输入一条消息,"Hello."其他人都能看到"Hello"。但是,通过在我的控制台中键入 "Hello",该消息已经存在。我不想看到播音员在我的屏幕上出现另一个 "Hello"。
这是您要实现的功能吗?如果是这样,我建议您不要删除该消息。如果你打印了一些东西来安慰,可能就不会那么容易擦掉它。相反,您一开始就不能发送它。
以下是我通常用于您不希望发件人看到他的消息两次的消息系统:
方便的是,每个连接到服务器的人都有一个 member
对象,每个 member
都有一个名字。希望名字是独一无二的。现在,如果您确保每个成员在连接到您的服务器时都得到一个名称标识,那么当您向所有人宣布消息时,您只需确保不向发件人宣布它。
具体来说,我会修改 announcer
class:
的构造函数和 run()
方法
String message;
String senderName;
announcer( member x , String msg ) {
senderName = x.name;
message= x.name + " : " + msg ;
}
public void run() {
for ( int i=0 ; i<server.group.size() ; i++ ) {
if ( !server.group.get( i ).name.equals( senderName ) ) {
send( server.group.get( i ).sck );
}
}
}
现在,消息被发送给除了发件人之外的所有人,这相当于发送给发件人然后删除它的结果。如果您必须编写更多代码才能正确设置每个人的名字,我很抱歉,但我还没有听说过任何实现中重复消息只是来自标准输出的 "erased"。
或者,如果您的 server.group
对象与您传递给播音员构造函数的 member
对象相同,那么这将起作用
String message;
member sender;
announcer( member x , String msg ) {
sender = x;
message= x.name + " : " + msg ;
}
public void run() {
for ( int i=0 ; i<server.group.size() ; i++ ) {
if ( server.group.get( i ) != sender ) {
send( server.group.get( i ).sck );
}
}
}
我正在 java 制作 console chat program。它接受用户文本输入并发送到服务器,然后服务器将其广播给所有客户端。 我想清除用户在他的控制台上输入的文本。
我更喜欢平台无关的解决方案。
import java.io.*;
class Test
{
public static void main(String args[])
{
System.out.print("you: ");
String t=getString();
System.out.println("We accepted : " + t);
}
static String getString()
{
String s;
try{
BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
s = bufferRead.readLine();
//int count = 1;
//System.out.print(String.format("3[%dA",count)); // Move up
//System.out.print("3[2K"); // Erase line content, works on terminal but not on cmd
for(int i=0;i<s.length();i++)
System.out.print("\b"); //dont know, why it doesnt works??
}
catch(IOException e)
{e.printStackTrace(); s="Error";}
return s;
}
}
这是我对你的问题的解释:
我是客户,我输入一条消息,"Hello."其他人都能看到"Hello"。但是,通过在我的控制台中键入 "Hello",该消息已经存在。我不想看到播音员在我的屏幕上出现另一个 "Hello"。
这是您要实现的功能吗?如果是这样,我建议您不要删除该消息。如果你打印了一些东西来安慰,可能就不会那么容易擦掉它。相反,您一开始就不能发送它。
以下是我通常用于您不希望发件人看到他的消息两次的消息系统:
方便的是,每个连接到服务器的人都有一个 member
对象,每个 member
都有一个名字。希望名字是独一无二的。现在,如果您确保每个成员在连接到您的服务器时都得到一个名称标识,那么当您向所有人宣布消息时,您只需确保不向发件人宣布它。
具体来说,我会修改 announcer
class:
run()
方法
String message;
String senderName;
announcer( member x , String msg ) {
senderName = x.name;
message= x.name + " : " + msg ;
}
public void run() {
for ( int i=0 ; i<server.group.size() ; i++ ) {
if ( !server.group.get( i ).name.equals( senderName ) ) {
send( server.group.get( i ).sck );
}
}
}
现在,消息被发送给除了发件人之外的所有人,这相当于发送给发件人然后删除它的结果。如果您必须编写更多代码才能正确设置每个人的名字,我很抱歉,但我还没有听说过任何实现中重复消息只是来自标准输出的 "erased"。
或者,如果您的 server.group
对象与您传递给播音员构造函数的 member
对象相同,那么这将起作用
String message;
member sender;
announcer( member x , String msg ) {
sender = x;
message= x.name + " : " + msg ;
}
public void run() {
for ( int i=0 ; i<server.group.size() ; i++ ) {
if ( server.group.get( i ) != sender ) {
send( server.group.get( i ).sck );
}
}
}