1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Zoom

Dieses Thema im Forum "JavaFX, Swing, Java2D/3D, SWT, JFace" wurde erstellt von Vasquez, 14. April 2004.

  1. Vasquez

    Vasquez Grünschnabel

    Hallo!

    Weiss jemand, wie man eine Zoom-Funktion implementiert? Ich habe einiges darueber gelesen... Das funktioniert irgendwie mit einer affinen Abbildung... der Hintergrund ist mir aus Mathe bekannt. Nur in Java komm ich noch nicht ganz drauf. Samplecodes ausm Netz brachten es bisher nicht, da die alle unverstaendlich sind. Es soll einfach, nachdem ich auf den Zoombutton gedrueckt habe, per Maus ein Fenster gezogen werden und dieser Teil soll dann ran- bzw. rausgezoomt werden... zum Beispiel... andere Vorschlaege und/oder Moeglichkeiten nehme ich dankbar an!

    Vielen Dank im Voraus fuer die Muehen!

    MfG
    Thomas
     
  2. Thomas Darimont

    Thomas Darimont Administrator

    Hallo!

    Siehe:

    Code (Text):
    1.  
    2. import java.awt.Color;
    3. import java.awt.Dimension;
    4. import java.awt.FlowLayout;
    5. import java.awt.Graphics;
    6. import java.awt.Graphics2D;
    7. import java.awt.MediaTracker;
    8. import java.awt.RenderingHints;
    9. import java.awt.event.MouseEvent;
    10. import java.awt.event.MouseMotionAdapter;
    11. import java.awt.geom.AffineTransform;
    12. import java.awt.image.AffineTransformOp;
    13. import java.awt.image.BufferedImage;
    14. import java.io.File;
    15. import java.io.IOException;
    16.  
    17. import javax.imageio.ImageIO;
    18. import javax.swing.JFrame;
    19. import javax.swing.JPanel;
    20.  
    21. /*
    22.  * ZoomFrame.java
    23.  *
    24.  * Created on 14. April 2004, 18:43
    25.  */
    26.  
    27. /**
    28.  *
    29.  * @author  Thomas Darimont
    30.  */
    31. public class ZoomFrame extends JFrame {
    32.  
    33.     //Unser "In-Memory Screen Buffer"
    34.     private BufferedImage screen;
    35.     //Der Ball ...
    36.     private BufferedImage shape;
    37.     //aktuelle X-Positionen der Maus im Panel ...
    38.     private int xPos;
    39.     private RenderingHints renderingHints;
    40.  
    41.     private JPanel gfxPanel;
    42.  
    43.     private final int MAX_IMAGE_SIZE_Y = 500;
    44.     private final int MIN_IMAGE_SIZE_Y = 100;
    45.  
    46.     private final int MAX_IMAGE_SIZE_X = 500;
    47.     private final int MIN_IMAGE_SIZE_X = 100;
    48.  
    49.     private final double SCALE_UP = 1.1d;
    50.     private final double SCALE_DOWN = 0.9d;
    51.  
    52.     private int width = 100;
    53.     private int height = 100;
    54.  
    55.     /** Creates new form ZoomFrame */
    56.     public ZoomFrame() {
    57.         initComponents();
    58.         screen = new BufferedImage(512, 384, BufferedImage.TYPE_INT_RGB);
    59.         loadImage();
    60.        
    61.         //Hier kann man mit den Verschiedenen RenderingOptionen der Klasser
    62.         //RenderingHints herumspielen ...
    63.         renderingHints =
    64.             new RenderingHints(
    65.                 RenderingHints.KEY_INTERPOLATION,
    66.                 RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    67.  
    68.     }
    69.  
    70.     /**
    71.      * Hier wird das Bild von der Festpallte geladen.
    72.      * Durch den MediaTracker stellen wir sicher, dass das Bild
    73.      * nach verlassen dieser Methode vollständig geladen ist.
    74.      *
    75.      */
    76.     private void loadImage() {
    77.        
    78.         MediaTracker mt = new MediaTracker(this);
    79.         try {
    80.             shape = ImageIO.read(new File("c:/ball.gif"));
    81.         } catch (IOException e) {
    82.             // TODO Auto-generated catch block
    83.             e.printStackTrace();
    84.         }
    85.         mt.addImage(shape, 0);
    86.  
    87.         try {
    88.             mt.waitForAll();
    89.         } catch (InterruptedException e1) {
    90.             // TODO Auto-generated catch block
    91.             e1.printStackTrace();
    92.         }
    93.         mt = null;
    94.  
    95.     }
    96.  
    97.     /**
    98.      * Ich überschriebe hier die paintComponent Methode von JPanel um das
    99.      * Bild anzeigen zu lassen ...
    100.      */
    101.     private void initComponents() {
    102.         setSize(512, 384);
    103.         setResizable(false);
    104.         gfxPanel = new javax.swing.JPanel() {
    105.             public void paintComponent(Graphics g) {
    106.                 super.paintComponent(g);
    107.                 if (screen != null)
    108.                     g.drawImage(screen, 0, 0, this);
    109.             }
    110.         };
    111.  
    112.         getContentPane().setLayout(new FlowLayout());
    113.  
    114.         setTitle("ZoomFrame");
    115.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    116.  
    117.         gfxPanel.setBackground(new Color(102, 153, 255));
    118.         gfxPanel.setMinimumSize(new Dimension(512, 384));
    119.         gfxPanel.setPreferredSize(new Dimension(512, 384));
    120.         gfxPanel.addMouseMotionListener(new MouseMotionAdapter() {
    121.             public void mouseMoved(MouseEvent evt) {
    122.                 jPanel1MouseMoved(evt);
    123.             }
    124.         });
    125.  
    126.         getContentPane().add(gfxPanel);
    127.  
    128.         pack();
    129.     }
    130.  
    131.     private void jPanel1MouseMoved(MouseEvent evt) {
    132.  
    133.         //Hat sich die Maus nach links oder rechts bewegt?
    134.         int dx = xPos - evt.getX();
    135.        
    136.         //Nur wenn die Maus über 30 Pixel gewandert ist soll neu gezeichnet werden ...
    137.         if (Math.abs(dx) > 30) {
    138.             //System.out.println(width + " : " + dx);
    139.             xPos = evt.getX();
    140.             AffineTransform transform = null;
    141.            
    142.             //Bilden des Transform Objektes für das Skalieren ...
    143.            
    144.             if (dx > 0 && (width * SCALE_UP <= 500)) {
    145.                 transform =
    146.                     AffineTransform.getScaleInstance(SCALE_UP, SCALE_UP);
    147.                 width *= SCALE_UP;
    148.             } else if (width * SCALE_DOWN >= 100) {
    149.                 transform =
    150.                     AffineTransform.getScaleInstance(SCALE_DOWN, SCALE_DOWN);
    151.                 width *= SCALE_DOWN;
    152.             } else {
    153.                 return;
    154.             }
    155.  
    156.             //Anwenden des Transform Objektes ....
    157.             AffineTransformOp transformOp =
    158.                 new AffineTransformOp(transform, renderingHints);
    159.             shape = transformOp.filter(shape, null);
    160.             draw();
    161.            
    162.             //Um den Garbage Collector etwas zu unterstützen ;-)
    163.             transform = null;
    164.             transformOp = null;
    165.         }
    166.     }
    167.  
    168.     /**
    169.      * Zeichnet das Bild in den In-Memory-Buffer und lässt diesen durch den Aufruf
    170.      * von updateUI() am JPanel durch dessen überschriebene paintComponentMethode
    171.      * aufs Panel malen.
    172.      */
    173.     private void draw() {
    174.  
    175.         if (screen != null) {
    176.             Graphics2D g2d = (Graphics2D) screen.getGraphics();
    177.             g2d.fillRect(0, 0, 512, 384);
    178.             if (shape != null) {
    179.                 g2d.drawImage(shape, 50, 50, gfxPanel);
    180.                 gfxPanel.updateUI();
    181.             }
    182.         }
    183.     }
    184.  
    185.     /**
    186.      * @param args the command line arguments
    187.      */
    188.     public static void main(String args[]) {
    189.         new ZoomFrame().show();
    190.     }
    191. }
    192.  
    193.  
    Gruß Tom
     

    Anhänge:

  3. Thomas Darimont

    Thomas Darimont Administrator

    Der Ball

    ...
     

    Anhänge:

    • ball.gif
      ball.gif
      Dateigröße:
      6,8 KB
      Aufrufe:
      5.936
  4. Vasquez

    Vasquez Grünschnabel

    ja, wunderbar... danke, ich werde erstmal brauchen das ganze zu verstehen.. da kommt bestimmt nochmal ne frage zurueck.

    MfG
    Thomas
     
  5. Vasquez

    Vasquez Grünschnabel

    Hallo!
    Ich haette da nochmal eine Frage. In deinem Code weist du deinem shape mit der loadImage() Methode das Bild zu, das gezeigt werden soll. Wenn ich nun lediglich ein Panel habe, was ja kein Bild ist, welches ich bereits fertig "bemalt" habe und das angezeigt und gezoomt werden soll.... wie sage ich ihm das?

    MfG
    Thomas
     
  6. Thomas Darimont

    Thomas Darimont Administrator

    Hallo!

    Du könntest dein JPanel beispielsweise mit einem java.awt.Robot
    "Fotografieren" und das dann als Image Verwenden ...

    oder du änderst deine Zeichnen Aktion auf dem JPanel so ab, dass du nicht auf das JPanel direkt zeichnest, sondern in ein in Memory Image und dass dann auf dem JPanel anzeigst. Dieses kannst du dann wie im Beispiel gezeigt verwenden.

    Gruß Tom
     

Diese Seite empfehlen