Java #3 – farbige Splash Screens in der Konsole erstellen

In meinem letzten Post habe ich die Farbgestaltung in Java etwas näher untersucht. Zusätzlich auch die Konsolensteuerung (Cursor bewegen, Konsoleninhalt manipulieren usw) getestet.
Daraus kann man ja schon eine Menge machen. Ich habe mich mal an einen „Splash Screen Generator“ gemacht. Klingt natürlich viel geiler als es ist.
Ziel soll es sein einen beliebigen umrahmten Text in beliebiger Farbgestaltung an beliebiger Stelle auf dem Bildschirm für eine beliebige Zeit anzeigen zu lassen. Für den Benutzer ist das mit 1 Funktionsaufruf besonders einfach gehalten.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

import java.io.IOException;
import java.io.*;
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.*;

public class test {
  
  public static final String CLS = "\u001b[2J";
  public static final String TOP = "\u001b[0;1H";
  public static final String UP = "\u001b[1F";
  public static final String LEFT = "\u001b[1G";
  public static final String DEL = "\u001b[2K";
  public static final String DEL_LEFT = "\u001b[1K";
  public static final String DEL_RIGHT = "\u001b[0K";
  public static final String BOLD = "\u001b[1m";
  public static final String RESET = "\u001b[0m";
  public static final String SPLASH = "\u001b[1;37;1;44m";
	
	public static void buildSplashScreen(String[] splash, int time, String Style, int x, int y) throws InterruptedException {
		Ansi ansi=Ansi.ansi();
		
		// get longest element
		int maxlength = 0;
		for(String getmax : splash) {
			if(getmax.length() > maxlength) maxlength = getmax.length();
		}
		
		// old style: AnsiConsole.out.print(SPLASH+"\u001b["+x+";"+y+"H");
		AnsiConsole.out.print(SPLASH+ansi.cursor(x-1,y));
		System.console().printf("\u2554");
		for(int i = 0;i<maxlength+2;i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557\n");
		for(int j = 0;j < splash.length;j++) {
			AnsiConsole.out.print(ansi.cursor(x,10)); x++;
			System.console().printf("\u2551 " + splash[j] + " \u2551\n");
		}
		AnsiConsole.out.print(ansi.cursor(x,10));
		System.console().printf("\u255A");
		for(int k = 0;k<maxlength+2;k++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u255D\n");
		
		Thread.sleep(time);
		
		clearScreen();
	}
	
	public static void clearScreen() {
		for(int i=0;i<50;i++)
        {
            AnsiConsole.out.println( RESET + DEL);
        }
        AnsiConsole.out.print( CLS + TOP );
	}

	public static void main(String[] args) throws IOException, InterruptedException {
		
		try {AnsiConsole.systemInstall();}catch(Exception e){}
		Ansi ansi=Ansi.ansi();
		
		String[] splash = new String[9];
		splash[0] = "                                                        ";
		splash[1] = " _    _  _____            ____                          ";
		splash[2] = "| |  | |/ ____|          / _| |                         ";
		splash[3] = "| |__| | (___  ___  ___ | |_| |___      ____ _ _ __ ___ ";
		splash[4] = "|  __  |\\___ \\/ __|/ _ \\|  _| __\\ \\ /\\ / / _` | '__/ _ \\";
		splash[5] = "| |  | |____) \\__ \\ (_) | | | |_ \\ V  V / (_| | | |  __/";
		splash[6] = "|_|  |_|_____/|___/\\___/|_|  \\__| \\_/\\_/ \\__,_|_|  \\___|";
		splash[7] = "                                                        ";
		splash[8] = "                                                        ";
		
		buildSplashScreen(splash, 5000, SPLASH, 10, 10);
		
		try {System.in.read();}catch(Exception e){}
	}
}

Die Funktion buildSplashScreen wird also mit 5 Parametern aufgerufen:

buildSplashScreen(String[] anzuzeigender-Text, int Anzeigedauer-in-Millisekunden, String Unicode-Farbstyle, int x-Koordinate, int y-Koordinate);

Den Anzeigetext als Array (ein- oder mehrzeilig möglich), Backslashes im Anzeigetext müssen natürlich doppelt gesetzt werden, Unicode Farbstyle als String mit einer Form ähnlich wie „\u001b[1;37;1;44m„, x- und y-Koordinate definiert die obere linke Ecke des Splash Screens.

Ausführung in Notepad++:
(schon mehrfach behandelt, aber nochmal zur Erinnerung)
Code anzeigen

(Vorbereitung hier) NppExec Plugin installieren, Batch erstellen mit folgendem Inhalt (oder unten downloaden):

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off

:: jar(s) specified?
if not [%4]==[] goto jars

:: compile and run without externals jars
if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

:jars
setlocal enabledelayedexpansion
set /a N=0

:: reads up to 6 externals jars
for /f "tokens=1,2,3 delims=;" %%a in ("%~4") do (
	set /a N+=1
	set j1=%%a
	set j2=%%b
	set j3=%%c
)

set classpath=%~2
set jarpath=%~2
if not [%5]==[] set jarpath=%~5
set jars=.
if not [%j1%]==[] set jars=%jars%;%jarpath%\%j1%
if not [%j2%]==[] set jars=%jars%;%jarpath%\%j2%
if not [%j3%]==[] set jars=%jars%;%jarpath%\%j3%

:: compile and run with external jars
if not [%1]==[] javac -cp "%jars%" %1

if not [%2]==[] if not [%3]==[] start cmd /c ""c:\Program Files\Java\jre7\bin\java" -cp "%jars%;%classpath%" %3"

endlocal

:: usage:

:: just compile
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar;lib2.jar"

:: just run java code
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm"

:: run java code with one or multiple external jars
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar"

:: run java code with one or multiple external jars - up to 3 jars supported (change lines 15-28 [if you know batch] for more)
:: usage: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar;lib2.jar;jcurse.jar"

:: Notepad++ F6 Code: 
::   NPP_SAVE
::   ?:\path\to\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "one_or_multiple_external.jar"

Batch, .java Code und alle nötigen .jars (jansi.jar in diesem Fall) in ein Verzeichnis, in Notepad++ F6 drücken, folgenden Code (erst anpassen!) einfügen:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "jansi.jar"

(bei mir liegen also .java, .jar und .bat in T:\Dropbox\Programmierung\Java\)

und dann sollte das funktionieren. Weitere Nutzungshinweise zur executor.bat befinden sich als Kommentar am Ende. Die Batch kann mittlerweile nur kompilieren (ohne und mit jars) und ausführen (ohne und mit jars).
Beachte: javac.exe und java.exe müssen in der Windows Umgebungsvariablen PATH eingetragen sein! siehe Vorbereitungen oder Google.

Demo

Download

executor [.bat]
SplashScreen [.java]
SplashScreen [.class]
jansi [.jar]

2 Kommentare

Schreibe einen Kommentar