Estoy de sorteo en mi JComponent algunas curvas, etc .. con la Gráfica de G ( no en 2D ).

Ahora quiero usar la rueda de mi ratón para acercar y alejar.

Las pistas ?

Oí hablar de una BuferredImage ?

  • Hay un número de consideraciones. Incluso si se muestra el contenido base a un BufferedImage, usted todavía tendrá que modificar el tamaño de los componentes, por lo que puede establecidos correctamente. Echa un vistazo AffineTransform
InformationsquelleAutor Choubidou | 2013-10-28

3 Comentarios

  1. 12

    Hay algunas consideraciones que usted necesita para tener en cuenta…

    El resultado final dependerá de lo que usted quiere lograr. Si usted está dibujando curvas mediante la Graphics2D de la API, puede ser más sencillo, simplemente escala de las coordenadas cada vez que el componente se representa. Usted tendrá que asegurarse de que cualquier cambio en la escala se refleja en el tamaño preferido del propio componente.

    También podría representar el «default» de salida a un BufferedImage y simplemente utilizar un AffineTransform para cambiar la ampliación de la se utiliza para mostrar el resultado, por ejemplo.

    Este simple utiliza un BufferedImage y carga una imagen de disco, pero el concepto básico es el mismo.

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseWheelEvent;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    public class ZoomPane {
    public static void main(String[] args) {
    new ZoomPane();
    }
    public ZoomPane() {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
    }
    JFrame frame = new JFrame("Testing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(new JScrollPane(new TestPane()));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    });
    }
    public class TestPane extends JPanel {
    private BufferedImage img;
    private float scale = 1;
    public TestPane() {
    try {
    img = ImageIO.read(new File("/path/to/image"));
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    addMouseWheelListener(new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
    double delta = 0.05f * e.getPreciseWheelRotation();
    scale += delta;
    revalidate();
    repaint();
    }
    });
    }
    @Override
    public Dimension getPreferredSize() {            
    Dimension size = new Dimension(200, 200);
    if (img != null) {            
    size.width = Math.round(img.getWidth() * scale);
    size.height = Math.round(img.getHeight() * scale);                
    }        
    return size;
    }
    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (img != null) {
    Graphics2D g2d = (Graphics2D) g.create();
    AffineTransform at = new AffineTransform();
    at.scale(scale, scale);
    g2d.drawImage(img, at, this);
    g2d.dispose();
    }
    }
    }
    }

    También podría escala de la Graphics contexto pasa a su paintComponent método directamente.

    Lo importante aquí es recordar que para restablecer el AffineTransform después de haber terminado, de lo contrario se pasará a otros componentes cuando son prestados, que no va a generar los resultados esperados…

    Este ejemplo, básicamente, crea una copia de la Graphics contexto que podemos manipular y desechar sin afectar el original, lo que es más sencillo trabajar con la

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseWheelEvent;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.GeneralPath;
    import java.awt.geom.Path2D;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    public class ZoomPane {
    public static void main(String[] args) {
    new ZoomPane();
    }
    public ZoomPane() {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
    }
    JFrame frame = new JFrame("Testing");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(new JScrollPane(new TestPane()));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    });
    }
    public class TestPane extends JPanel {
    private float scale = 1;
    public TestPane() {
    addMouseWheelListener(new MouseAdapter() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
    double delta = 0.05f * e.getPreciseWheelRotation();
    scale += delta;
    revalidate();
    repaint();
    }
    });
    }
    @Override
    public Dimension getPreferredSize() {
    Dimension size = new Dimension(200, 200);
    size.width = Math.round(size.width * scale);
    size.height = Math.round(size.height * scale);
    return size;
    }
    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    AffineTransform at = new AffineTransform();
    at.scale(scale, scale);
    g2d.setTransform(at);
    g2d.setColor(Color.RED);
    //This is for demonstration purposes only
    //I prefer to use getWidth and getHeight
    int width = 200;
    int height = 200;
    Path2D.Float path = new Path2D.Float();
    int seg = width / 3;
    path.moveTo(0, height / 2);
    path.curveTo(0, 0, seg, 0, seg, height / 2);
    path.curveTo(
    seg, height, 
    seg * 2, height, 
    seg * 2, height / 2);
    path.curveTo(
    seg * 2, 0, 
    seg * 3, 0, 
    seg * 3, height / 2);
    g2d.draw(path);
    g2d.dispose();
    }
    }
    }

    Echa un vistazo a La transformación de las Formas, el Texto y las Imágenes para más detalles

    • Excelente! Véase también SineTest.
    • Cómo? Usted todavía tiene que hacer todo el trabajo, ¿por qué complicar más. También puedo aplicar RenderingHints a la salida si quería – esto es sólo yo 😉
    • uhh! me he perdido el punto. Olvida 🙂 +1
    • probablemente fuera de tema, pero todavía con la mención de RenderingHints: mientras trabajaba con un 1-2 meses atrás con la escala, me encontré con que la configuración de RenderingHints: BICUBIC o BILINEAR para el escalado de la imagen, la calidad es baja en comparación con otros nativos de aplicaciones de procesamiento de imagen, al menos si la imagen contiene Text. He probado con ANTIALIASING sugerencias, pero un poco de mejora.
    • La escala de texto es un dolor. Mucho también dependiendo de si usted está haciendo un directo de escala o escalonado escala algoritmo, por ejemplo
  2. 0

    Pongo este simple código para mostrar cómo utilizar la rueda del ratón mouving mediante la adición de un MouseWheelListener a un JPanel:

    myJpanel.addMouseWheelListener(new MouseWheelListener() {               
    @Override
    public void mouseWheelMoved(MouseWheelEvent mwe) {
    jPanelMouseWheelMoved(mwe);
    }
    });

    Para implementar la rueda del ratón oyente:

    private void jPaneMouseWheelMoved(MouseWheelEvent mwe) {
    if(Event.ALT_MASK != 0) {
    if(mwe.getWheelRotation() > 0) {
    //here you put your code to scrool douwn or to minimize. 
    System.out.println(" minimize by "+(-1*mwe.getWheelRotation()));             
    }
    else if(mwe.getWheelRotation() < 0) {
    //here you put your code to scrool up or to maximize.
    System.out.println(" maximaze by "+(-1*mwe.getWheelRotation()));
    }           
    }        
    }

    Puede adaptar este ejemplo para hacer zoom o a scrool lo que usted desea.

Dejar respuesta

Please enter your comment!
Please enter your name here