Ein paar (F)AQs, Teil 3

Reguläre Ausdrücke und Gruppen

Um bei einem Pattern wie Pattern pattern = Pattern.compile(“(In)|(present|the)“); herauszufinden, ob das gefundene Wort aus der ersten Gruppe („In“) oder aus der zweiten Gruppe („present|the“) kommt, lässt sich group(int) verwenden.

Pattern pattern = Pattern.compile( "(In)|(present|the)" );
String string = "In the present study the cytotoxic activity of aloin";   Matcher matcher = pattern.matcher( string );   while ( matcher.find() )
{
 System.out.println( "Found: " + matcher.group() );   if ( matcher.group(1) != null )
  System.out.println( "\tGruppe *1*" );
 else if ( matcher.group(2) != null )
  System.out.println( "\tGruppe *2*" );   System.out.println( "\tStart At: " + matcher.start() );
 System.out.println( "\tEnd At: " + matcher.end() );
 System.out.println( "\tGroupID: " + "???" );
}

BIG_ENDIAN oder LITTLE_ENDIAN?

In verschiedenen Programmen wird zwischen BIG_ENDIAN und LITTLE_ENDIAN unterschieden. Unter Java wird alles als in BIG_ENDIAN gespeichert. Sollen die Bytes umgedreht werden, reicht folgendes:

public class Swap
{
  public final static int swapInt( int v )
  {  
    return  (v >>> 24) | (v << 24) | ((v << 8) & 0x00FF0000) | ((v >> 8) & 0x0000FF00);
  }   public static void main( Strings[] args )
  {
    //  before 0x01020304  
    //    after  0x04030201    int v = 0x01020304;  
    System.out.println("before : 0x" + Integer.toString(v,16));  
    System.out.println("after  : 0x" + Ineger.toString(swapInt(v),16));  
  }  
}

Um herauszufinden, ob BIG_ENDIAN oder LITTLE_ENDIAN darunterliegt, würde ich die Architektur aus den Properties auslesen und dann abschätzen.

Wie kann man eine neue JVM aus einem Java-Programm starten?

Man kann eine neue VM aus einem Java-Programm starten, und der dabei natürlich eine Main-Klasse und alle möglichen Parameter mitgeben. Alle anderen Dienstprogramme, wie javac, jar, sind reine Java-Programme, die man auch anders nutzen kann, aber für das Starten einer JVM ist das mit ProcessBuilder oder exec() am Einfachsten.

ProcessBuilder builder = new ProcessBuilder( "java", "Sample" );
Map<String, String> env= builder.environment();
env.put( "V", "sample" );
Process process = builder.start();

Wenn das Programm das folgende ist:

public class Sample {
 public static void main( String[] args ) {
  System.out.println( System.getenv("V") );
 }
}

Für Java 5 war mal eine Isolation API (Beschreibung) geplant, aber daraus wurde nix.

Wie kann man die Bildschirmausgabe in ein Textfeld umleiten

Folgendes genügt, um die Ausgabe in ein Fenster umzuleiten; es referenziert die Variable ta ein TextArea-Objekt:

PrintStream p = new PrintStream( 
  new OutputStream() { 
    public void write( int b ) { 
      ta.append( (char)b ); 
    } 
  } 
);   System.setErr( p ); 
System.setOut( p );

Wie kann man ein proportionales Vergrößern eines Fensters erreichen?

Wenn wir auf die Größenveränderung eines Fensters achten wollen, so müssen wir mit addComponentListener() einen Listener an das Fenster hängen, der auf die Veränderung reagiert. Wir implementieren eine Klasse, die sich von ComponentAdapter ableitet und überschreiben componentResized(). Wenn wir nur das Frame-Objekt als Ereignishorcher mit dem ComponentListener verbinden, ist klar, wer der Auslöser war. Mit getComponent() auf dem Ereignisobjekt bekommen wir genau diesen Frame. Nun ist es Sache des Algorithmus, wie mit der Größenveränderung zu verfahren ist. Eine Möglichkeit ist, die aktuelle Größe mittels getSize() auszulesen und dann das Minimum aus Höhe und Breite wieder mit setSize() zu setzen.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*;   public class ResizeTheFrame extends JFrame 
{ 
  public ResizeTheFrame() 
  { 
    setSize( 200, 200 ); 
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
    setVisible( true ); 
  }   public static void main( String[] args ) 
  { 
    new ResizeTheFrame().addComponentListener( new ResizeEvent() ); 
  }   static class ResizeEvent extends ComponentAdapter 
  { 
    @Override 
    public void componentResized( ComponentEvent event ) 
    { 
      if ( event.getID() == ComponentEvent.COMPONENT_RESIZED ) 
      { 
        JFrame f = (JFrame) event.getComponent(); 
        Dimension d = f.getSize(); 
        int size = Math.min( d.width, d.height ); 
        f.setSize( size, size ); 
      } 
    } 
  } 
}

Wie kann man für die Hilfe mit F1 soll eine Aktion auslösen?

frame.getRootPane().getInputMap( JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "HELP" );
frame.getRootPane().getActionMap().put( "HELP", new AbstractAction()
{
  @Override public void actionPerformed( ActionEvent e )
  {
    // ..
  }
} );

Wie kann man das L & F für alle Fenster setzen?

Das Setzen eines L & Fs mit setLookAndFeel() führt zu keinem Neuzeichnen der Komponenten. Wird das neue L & F gesetzt, bevor Swing die Komponenten darstellen muss, fällt das nicht auf. Mit dargestellten Komponenten müssen wir jedoch das Neuzeichnen anstoßen. Dazu dient die Methode SwingUtilities.updateComponentTreeUI(component), wobei component im Allgemeinen das Window (also JFrame/JWindow) ist. Ein Problem ergibt sich, wenn der Frame noch Window-Objekte erzeugt, da diese immer Kinder eines Fensters sind; Änderungen des Aussehens müssen an diese Kinder weitergegeben werden. Dazu erfragen wir zuerst alle Fenster über die statische Funktion Frame.getFrames(). Anschließend laufen wir vom Fenster alle Windows ab, die wir dann aktualisieren.

for ( Frame f : Frame.getFrames() )
{
 SwingUtilities.updateComponentTreeUI( f );
 for ( Window w : f.getOwnedWindows() )
 SwingUtilities.updateComponentTreeUI( w );
}

Wie kann man Text um 90° drehen?

Um einen Text um 90 Grad zu drehen, gibt mehrere Möglichkeiten: 1. Den Text in eine Offscreen Image legen und 1.1 dann zum Beispiel einen Filter drauf loslassen 1.2 ein Arrays raus machen (PixelGrabber) und das Feld umdrehen und wieder in ein Image konvertieren (MemoryImageSource) (ist im Prinzip ein Filter) (Ein Beispiel für einen Rotate Filter findet sich auch im Sun Tutorial) 2. Swing nehmen, den mit dem AffineTransform-Objekt bekommt einen Winkel über setToRotation() und zeichnet dann.

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;   public class Demo2D extends Frame
{
  public Demo2D()
  {
    setSize( 400, 400 );
    addWindowListener( new WindowAdapter() {
      public void windowClosing ( WindowEvent e ) { System.exit(0); }
    });
  }   public void paint( Graphics g )
  {
    Graphics2D g2d = (Graphics2D) g;
    AffineTransform at = new AffineTransform();
    at.setToTranslation( 200.0, 200.0);
    g2d.transform(at);
    at.setToRotation(Math.PI / 2.0);   for (int i = 0; i < 4; i++) {
        g2d.drawString( "Tutego likes Java", 0.0f, 0.0f );
        g2d.transform(at);
    }
  }   public static void main( String[] args )
  {
    new Demo2D().setVisible( true );
   }
}

Ähnliche Beiträge

Ein Gedanke zu “Ein paar (F)AQs, Teil 3

  1. >> Wie kann man eine neue JVM aus einem Java-Programm starten?

    So einfach wie es hier dargestellt wird ist es leider nicht.
    Dies wird in dieser Form nur funktionieren wenn „java“ bekannt ist,
    z.B. JRE/JDK in der Umgebungsvariable PATH ist.

    Ist dies nicht der Fall dann wird es deutlich komplexer – auch wenn
    das Verzeichnis vom JRE/JDK bekannt ist – eine plattformunabhängige
    Lösung zu implementieren. Es ist empfehlenswert zumindest mal einen
    Blick im ANT-API in den Java-Task zu werfen..

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert