Archive for Java

Java: Keylistener auf Konsolenebene

java

Man kann GUIs bauen mit Java – wenn man will. AWT und Swing existieren. Eigentlich ist Java aber konsolenbasiert. Um so erstaunlicher, dass es von Haus aus (immer noch) keine Möglichkeit gibt, einzelne Zeichen einzulesen, ohne nach Eingabe auf Return/Enter warten zu müssen. Das wäre aber nötig, um zB die (komfortable) Steuerung einer Konsolenanwendung mit der Tastatur zu ermöglichen. Mit dem Package JLine (speziell ConsoleReader.readCharacter) kann man das – hier die “Hello World“-Version:

package input;

import jline.ConsoleReader;

public class Keylistener
{
private static final char NOOP    = ’0′;
private static final char QUIT    = ‘q’;
private static final char UP    = ‘w’;
private static final char DOWN    = ‘s’;
private static final char LEFT    = ‘a’;
private static final char RIGHT    = ‘d’;

private static char[] allowed = { UP, DOWN, LEFT, RIGHT, QUIT };

public static void main( String[] args )
{
char input = NOOP;

try
{
ConsoleReader console = new ConsoleReader();

while( input!=QUIT ){
input = (char)console.readCharacter( allowed );
console.clearScreen();

switch( input ){
case UP:
System.out.println( “up” );
break;
case LEFT:
System.out.println( “left” );
break;
case DOWN:
System.out.println( “down” );
break;
case RIGHT:
System.out.println( “right” );
break;
}
}
}
catch( Exception e ){}
}
}

HTH – und sorry für die nicht vorhandene Formatierung :-)

Kommunikation zwischen Flash und Java

Wer jemals in die Verlegenheit kommt, zwischen Actionscript und Java kommunizieren zu müssen: Hier als eine mögliche Lösung, eine Socket-Verbindung. Zuerst auf Java-Seite:

import java.net.ServerSocket;
import java.net.Socket;

// …

// Port öffnen; Portnummer angeben:
ServerSocket mySocketServer = new ServerSocket(2001);

// nur Windows-Systeme:
Runtime.getRuntime().exec(“startflash.bat”);
Socket mySocket = mySocketServer.accept();

// Der Socket-Server kann geschlossen werden,
// da die Verbindung besteht
mySocketServer.close();

Über diese Verbindung kann nun byteweise geschrieben werden – ein String muss dazu erst in seine Bytes umgewandelt werden:

InputStream in = mySocket.getInputStream();
OutputStream out = mySocket.getOutputStream();
BufferedOutputStream buffout = new BufferedOutputStream(out);
String s = „zu schreibender Text“;
buffout.write(s.getBytes()); // 8 bit ASCII
buffout.write(0);
buffout.flush(); // Cache leeren

Auf Flash-Seite wird nun auf dem Port “gelauscht”:

var socket:XMLSocket = new XMLSocket();
socket.onData = function(data) { /* do someting */ };

// Ggf. IP und Portnummer anpassen:
socket.connect(“127.0.0.1”, 2001);

Die Verbindung kann von Java aufrecht erhalten werden mittels

do{} while (in.read(new byte[1], 0, 1) > -1);

bevor sie geschlossen wird:

in.close();
out.close();
mySocket.close();

Eine “sinnvollere” while-Schleife wäre etwa über das Einlesen einer Datei. Wozu das Ganze? Tja, man kann mit Java recht einfach MIDI-Dateien einlesen, diese mit Flash aber besser visualisieren (Details unter dem Link). Links dazu: FlashMIDI, JMusic.

Möglichkeiten zur Visualisierung von Musik in Flash haben Sven und Axel mit ihrer Videoorgel aufgezeigt.

hf.