Hola, descubrimos la respuesta a lo que estabas buscando, desplázate y la hallarás aquí.
Solución:
Aunque no lo he probado yo mismo, en Windows, uno puede usar la llamada a la API de Win32 para SetConsoleTitle
para cambiar el título de la consola.
Sin embargo, dado que se trata de una llamada a una biblioteca nativa, requerirá el uso de algo como Java Native Interface (JNI) para realizar la llamada, y esto solo funcionará en Windows 2000 y versiones posteriores.
Editar – Una solución usando JNI
El siguiente es un ejemplo del uso de JNI para cambiar el título de la ventana de la consola de Java en Windows. Para implementar esto, el requisito previo es algún conocimiento en C y usar el compilador/enlazador.
Primero, aquí está el resultado:
(fuente: coobird.net)
Descargo de responsabilidad: esta es mi primera aplicación Java que usa JNI, por lo que probablemente no sea un buen ejemplo de cómo usarlo; no realizo ninguna verificación de errores y es posible que me falten algunos detalles.
El programa Java era el siguiente:
class ChangeTitle
private static native void setTitle(String s);
static
System.loadLibrary("ChangeTitle");
public static void main(String[] args) throws Exception
for (int i = 0; i < 5; i++)
String title = "Hello! " + i;
System.out.println("Setting title to: " + title);
setTitle(title);
Thread.sleep(1000);
Básicamente, el título se cambia cada 5 segundos llamando al setTitle
método nativo en una biblioteca nativa externa llamada ChangeTitle
.
Una vez compilado el código anterior para hacer un ChangeTitle.class
archivo, el javah
El comando se usa para crear un encabezado C que se usa al crear la biblioteca C.
Escribiendo la biblioteca nativa
Escribir la biblioteca implicará escribir el código fuente C contra el archivo de encabezado C generado por javah
.
los ChangeTitle.h
el encabezado era el siguiente:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class ChangeTitle */
#ifndef _Included_ChangeTitle
#define _Included_ChangeTitle
#ifdef __cplusplus
extern "C"
#endif
/*
* Class: ChangeTitle
* Method: setTitle
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_ChangeTitle_setTitle
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
#endif
#endif
Ahora, la implementación, ChangeTitle.c
:
#include
#include
#include
#include
#include "ChangeTitle.h"
JNIEXPORT void JNICALL
Java_ChangeTitle_setTitle(JNIEnv* env, jclass c, jstring s)
const jbyte *str;
str = (*env)->GetStringUTFChars(env, s, NULL);
SetConsoleTitle(str);
(*env)->ReleaseStringUTFChars(env, s, str);
;
A String
que se pasa a la función nativa se cambia a un C codificado en UTF-8 stringque se envía a la SetConsoleTitle
que, como sugiere el nombre de la función, cambia el título de la consola.
(Nota: puede haber algunos problemas con solo pasar el string en el SetConsoleTitle
función, pero de acuerdo con la documentación, también acepta Unicode. No estoy muy seguro de qué tan bien funcionará el código anterior al enviar varias cadenas).
Lo anterior es básicamente una combinación de código de muestra obtenido de la Sección 3.2: Acceso a cadenas de la Guía y especificación del programador de la interfaz nativa de Java, y el SetConsoleTitle
Página de funciones de MSDN.
Para obtener un código de muestra más complicado con verificación de errores, consulte la Sección 3.2: Acceder a cadenas y SetConsoleTitle
Páginas de funciones.
Construyendo la DLL
La parte que resultó tomar la mayor cantidad de tiempo para mí fue hacer que los archivos C se compilaran en una DLL que en realidad podría leerse sin causar un UnsatisfiedLinkError
.
Después de mucho buscar y probar cosas, pude compilar la fuente C en una DLL que se podía llamar desde Java. Como estoy usando MinGW, encontré un formulario de página mingw.org
que describía exactamente cómo construir una DLL para JNI.
Fuentes:
- La guía y especificación del programador de la interfaz nativa de Java
- Capítulo 2: Primeros pasos: detalla el proceso con JNI.
- JNI-MinGW-DLL: creación de una DLL de JNI en MinGW con gcc.
Esto depende de su emulador de terminal, pero esencialmente solo está imprimiendo secuencias de control en la consola.
Ahora no tengo claro a qué secuencias de control responde CMD.EXE (no tengo una disponible para probar esto), pero escuché que hay un comando llamado TÍTULO que establece el título de la ventana. Intenté canalizar la salida de TITLE a un archivo, pero aparentemente, en realidad no establece el título al generar caracteres de control. El comando INICIO puede tomar un parámetro que es el título de la ventana seguido del comando para ejecutar en la ventana. Entonces algo como
cmd TITLE "lovely Application that is in a command window." && "java" MyApp
REM or
start "lovely Application that is java based." java MyApp
Personalmente, simplemente empaquetaría todo con un acceso directo donde puede editar las propiedades, como el directorio actual, el comando, sus parámetros y el tamaño, el estilo y el título de la ventana (si no recuerdo mal). Dale un buen ícono y la gente lo usará.
Aquí está mi solución usando JNA:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class SetTitle
public interface CLibrary extends Library
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"),
CLibrary.class);
boolean SetConsoleTitleA(String title);
public static void main(String[] args)
CLibrary.INSTANCE.SetConsoleTitleA("Testing 123");
System.exit(0);