Plotten mit Swing
Ein kurzes Programm
Das folgende Beispielprogramm zeigt das Setzen eines Pixels in der Mitte eines Fensters. Es wurde mit der Absicht programmiert, ein möglichst kurzes Beispielprogramm für diesen Zweck zu schreiben.
Main.java
class Main extends javax.swing.JComponent implements java.lang.Runnable
{ final int X = 320; final int Y = 200;@java.lang.Override
public void paintComponent( final java.awt.Graphics graphics )
{ graphics.fillRect( X/2, Y/2, 1, 1 ); }@java.lang.Override public final void run()
{ final javax.swing.JFrame frame = new javax.swing.JFrame( "Main" );
Main.this.setPreferredSize( new java.awt.Dimension( X, Y ));
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE );
frame.add( Main.this ); frame.pack(); frame.setVisible( true ); }public static void main( final java.lang.String args[] )
{ java.awt.EventQueue.invokeLater( new Main() ); }}- Aussprachehinweis
- close cloz
Ein kurzes Programm mit Puffer
Der Puffer »window« erlaubt es bei Bedarf, einzelne Pixel bei Bedarf mit »getRGB« wieder einzulesen. Außerdem erlaubt er es, eine Zeichnung anzuzeigen, ohne daß diese immer wieder neu gezeichnet werden muß.
Main.java
class Main extends javax.swing.JComponent implements java.lang.Runnable
{ final int X = 320; final int Y = 200;final java.awt.image.BufferedImage window
= new java.awt.image.BufferedImage
( X, Y, java.awt.image.BufferedImage.TYPE_INT_RGB );@java.lang.Override
public void paintComponent( final java.awt.Graphics graphics )
{ graphics.drawImage( Main.this.window, 0, 0, null ); }@java.lang.Override public final void run()
{ final javax.swing.JFrame frame = new javax.swing.JFrame( "Main" );
Main.this.setPreferredSize( new java.awt.Dimension( X, Y ));
Main.this.window.setRGB( X/2, Y/2, 0xFFFFFF );
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE );
frame.add( Main.this ); frame.pack(); frame.setVisible( true ); }public static void main( final java.lang.String args[] )
{ java.awt.EventQueue.invokeLater( new Main() ); }}
Ein einfaches Rahmenwerk
Das folgende Beispielprogramm zeigt das Setzen eines Pixels eines Fensters. Diesmal war die Absicht eine möglichst übersichtliche Main -Klasse zu erhalten, in welcher die Methode »main« eine Staffelei der Klasse »Easel« einrichtet und eine Methode »plot« dann etwas in eine von dieser Staffelei bereitgestellte Zeichenfläche der Klasse »Canvas« schreibt.
Main.java
class Main implements Plotter
{public static void main( final java.lang.String args[] )
{ new Easel( 200, 320 ).invokeLater( new Main() ); }public void plot( final Canvas canvas )
{ canvas.setRGB( canvas.height()/2, canvas.width()/2, 0xFFFFFF ); }}
Nun müssen noch die drei verwendeten Referenztypen bereitgestellt werden.
Objekte der Klasse »Canvas« repräsentieren eine Zeichenfläche.
Canvas.java
class Canvas extends javax.swing.JComponent
{ private static final long serialVersionUID = 0L;
final java.awt.image.BufferedImage image;
final int Y; final int X;
public Canvas( final int Y, final int X )
{ this.Y = Y; this.X = X;
this.image = new java.awt.image.BufferedImage
( Canvas.this.X, Canvas.this.Y, java.awt.image.BufferedImage.TYPE_INT_RGB );
Canvas.this.setPreferredSize( new java.awt.Dimension( this.X, this.Y )); }
public int getRGB( final int y, final int x )
{ return Canvas.this.image.getRGB( x, y ); }
public void setRGB( final int y, final int x, final int color )
{ Canvas.this.image.setRGB( x, y, color ); }
public int width(){ return this.X; }
public int height(){ return this.Y; }
@java.lang.Override
public void paintComponent( final java.awt.Graphics graphics )
{ graphics.drawImage( Canvas.this.image, 0, 0, null ); }}
Exemplare der Klasse »Plotter« greifen auf eine ihnen bereitgestellte Zeichenfläche zu.
Plotter.java
interface Plotter{ public void plot( final Canvas canvas ); }
Objekte der Klasse »Easel« („Staffelei“) bauen ein Hauptfenster mit einer sichtbaren Zeichenfläche auf und rufen dann den ihnen übergebenen Plotter auf, damit dieser etwas in diese Fläche zeichnen kann.
Easel.java
class Easel implements java.lang.Runnable
{ Canvas canvas;
Plotter plotter;
final int height;
final int width;
public Easel( final int height, final int width )
{ this.height = height; this.width = width;
this.canvas = new Canvas( height, width ); }
public void invokeLater( final Plotter plotter )
{ Easel.this.plotter = plotter;
java.awt.EventQueue.invokeLater( Easel.this ); }
@java.lang.Override public final void run()
{ final javax.swing.JFrame frame = new javax.swing.JFrame( "Main" );
Easel.this.plotter.plot( Easel.this.canvas );
frame.setDefaultCloseOperation( javax.swing.JFrame.EXIT_ON_CLOSE );
frame.add( Easel.this.canvas ); frame.pack(); frame.setVisible( true ); }}