Java >> Java tutorial >  >> Java

Introducer animerede markører til Java GUI'er, del 1

Jeff Friesen begynder en serie i tre dele, der introducerer tre implementeringer af sit Java-baserede animerede markørbibliotek, som udtrækker markørbilleder og andre data fra Windows-baserede .ani-filer og animerer markørerne over Java-komponenter. Hver implementering bygger på sin forgænger og gør gradvist biblioteket til et ekstremt nyttigt produkt. Denne artikel beskriver den mest grundlæggende implementering og introducerer en applikation til test af alle tre implementeringer.

Animerede markører understøttes af de fleste af Microsofts Windows-operativsystemer. For eksempel gør Windows XP det muligt at ændre standardpilemarkøren til en gående dinosaur eller til en markør med animerede regnbuefarver. Fordi Java dog ikke understøtter animerede markører, har jeg udviklet et bibliotek, der bringer Windows-baserede animerede markører til Java.

Denne artikel begynder en serie i tre dele, der introducerer tre implementeringer af mit Java-baserede animerede markørbibliotek. Artiklen præsenterer først en Swing-applikation, der demonstrerer mulighederne for alle implementeringer, og derefter undersøger kildekoden for den mest grundlæggende implementering. Fremtidige artikler introducerer forbedrede implementeringer.

BEMÆRK

Jeg byggede og testede denne artikels kode med Java SE 6 på en Windows XPSP2-platform. Biblioteket kan også kompileres med J2SE 5.x og kan bruges på andre platforme. Du kan downloade koden her.

Lad der være animerede markører

AniCursorDemo Swing-applikationen demonstrerer det animerede cursorbibliotek. Dette program bruger biblioteket til at udtrække markørbilleder fra en Windows-baseret .ani (animeret markør) fil identificeret via kommandolinjen. Det bruger også biblioteket til at starte og stoppe en animationstråd, som sørger for at animere disse billeder over en etiketkomponent. Liste 1 præsentererAniCursorDemo 's kildekode.

Angivelse 1 AniCursorDemo.java .

// AniCursorDemo.java

// Test an animated cursor.

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import ca.mb.javajeff.anicursor.*;

public class AniCursorDemo extends JFrame
{
  AniCursor anicursor;

  JButton btnStop;

  JLabel label;

  public AniCursorDemo (final String aniName)
  {
   super ("AniCursorDemo");
   setDefaultCloseOperation (EXIT_ON_CLOSE);

   GPanel gpanel = new GPanel ();

   final JButton btnStart = new JButton ("Start");
   ActionListener al;
   al = new ActionListener ()
      {
        public void actionPerformed (ActionEvent ae)
        {
         if (anicursor == null)
           try
           {
             anicursor = new AniCursor (aniName, label);
           }
           catch (Exception ex)
           {
             System.err.println (ex.getMessage ());
             return;
           }

         btnStop.setEnabled (true);
         btnStart.setEnabled (false);
         anicursor.start ();
        }
      };
   btnStart.addActionListener (al);
   gpanel.add (btnStart);

   gpanel.add (label = new JLabel ("Animated cursor only appears over this "+
                   "label!"));
   label.setBorder (BorderFactory.
            createCompoundBorder (BorderFactory.
                       createEtchedBorder (),
                       BorderFactory.
                       createEmptyBorder (5, 5, 5, 5)));

   btnStop = new JButton ("Stop");
   btnStop.setEnabled (false);
   al = new ActionListener ()
      {
        public void actionPerformed (ActionEvent ae)
        {
         anicursor.stop ();
         btnStart.setEnabled (true);
         btnStop.setEnabled (false);
        }
      };
   btnStop.addActionListener (al);
   gpanel.add (btnStop);

   setContentPane (gpanel);

   pack ();
   setResizable (false);
   setVisible (true);
  }

  public static void main (final String [] args)
  {
   Runnable r;
   r = new Runnable ()
     {
       public void run ()
       {
         new AniCursorDemo (args.length == 0 ? null : args [0]);
       }
     };
   EventQueue.invokeLater (r);
  }
}

class GPanel extends JPanel
{
  private GradientPaint gp;

  public void paintComponent (Graphics g)
  {
   Graphics2D g2d = (Graphics2D) g;

   if (gp == null)
     gp = new GradientPaint (0, 0, Color.white, 0,
                 getHeight (), Color.pink);

   // Paint a nice gradient background with white at the top and pink at
   // the bottom.

   g2d.setPaint (gp);
   g.fillRect (0, 0, getWidth (), getHeight ());
  }
}

AniCursorDemo opretter en singleton AniCursor instans fra den handlingslytter, der er tildelt Start-knappen. Denne instans, som repræsenterer en animeret markør, initialiseres med navnet (og valgfri sti) på en Windows .ani fil. Den initialiseres også med en reference til en etiketkomponent, som er knyttet til den animerede markør.

Efter at have oprettet AniCursor forekomst, beder lytteren denne forekomst om at starte sin animationstråd. Når musen bevæger sig over den tidligere specificerede etiket, vil den animerede markør vises over denne komponent. Stop-knappens handlingslytter fortæller AniCursor forekomst for at stoppe animationstråden.

Kompilér og kør applikationen

Denne artikels kodearkiv indeholder AniCursorDemo.java og bibliotekets kildefiler. Du skal kompilere alle disse filer, før du kan køre denne applikation. Følg disse trin for at tage dig af kompileringsopgaven:

  1. Udpak kodearkivet.
  2. Lav den udpakkede AniCursorDemo katalog den aktuelle mappe.
  3. Kompilér koden via følgende kommando (forudsat Windows XP):
    javac -cp ../ AniCursorDemo.java

    Forudsat at AniCursorDemo er stadig den aktuelle mappe, og hvis du antager en Windows XP-platform, vil du påberåbe dig følgende:

    java -cp ../;. AniCursorDemo

Figur 1 viser GUI'en efter at have klikket på knappen Start.

Figur 1 Den standardanimerede markør er en roterende to-vejs pil.

Hvis du ikke angiver en Windows .ani fil via kommandolinjen,AniCursorDemo passerer null til AniCursor ’ konstruktør. Denne værdi vælger standard roterende to-vejs pilemarkør, som er indbygget i AniCursor .

Du kan nemt angive stien og navnet på en Windows .ani fil via et kommandolinjeargument. For eksempel, påkald følgende for at afsløre WindowsXPs farverige pilemarkør, som er vist i figur 2:

java -cp ../;. AniCursorDemo \windows\cursors\rainbow.ani

Figur 2 Pilemarkøren afslører en regnbue af farver.

Som et sidste eksempel, påkaldelse af følgende kommando får Windows XPs gående dinosaur (vist i figur 3) til at dukke op, når musen bevæger sig hen over etiketten:

java -cp ../;. AniCursorDemo \windows\cursors\dinosaur.ani

Figur 3 Ikke alldinosaurer er uddøde!


Java tag