Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] drag di una immagine come in AcrobatReader

    ciao a tutti
    ho un problema interessante cercando di fare il drag di una immagine (un extended JLabel) all'interno di un JScrollPane

    il drag risulta a scatti e 'frilla' con velocità normale mentre svolge un drag decente con lenta velocità (che non va bene) quindi fa schifo!
    Io volevo una cosa esattamente come il drag di Acrobat Reader
    posto il codice che racchiude il mio problema:
    ringrazio tutti per l'interessamento
    ---------------------------------------------------

    package mydragphoto;

    import java.awt.Image;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.Rectangle;
    import javax.swing.*;

    public class MyDragImage extends javax.swing.JFrame {

    private Image II;
    public ImageLabel img;
    JScrollBar sbH;
    JScrollBar sbV;

    private int Xpos = 0;
    private int Ypos = 0;

    public MyDragImage() {
    this.img = new ImageLabel();
    initComponents();
    this.setSize(450, 400);
    this.side_image.setBackground(Color.BLACK);
    this.side_image.setLayout(null);
    }

    private void side_imageMouseDragged(java.awt.event.MouseEvent evt) {
    int h,v;

    h = this.Xpos - evt.getX();
    v = this.Ypos - evt.getY();

    ///////////////////primo metodo ////////////////////
    // sbH.setValue(sbH.getValue() - h);
    // sbV.setValue(sbV.getValue() - v);


    ////////////////secondo metodo ////////////////////
    Rectangle r = this.jScrollPane1.getViewport().getViewRect();
    r.x += h;
    r.y += v;
    this.side_image.scrollRectToVisible(r);


    this.Xpos = evt.getX();
    this.Ypos = evt.getY();
    }

    private void side_imageMousePressed(java.awt.event.MouseEvent evt) {
    this.Xpos = evt.getX();
    this.Ypos = evt.getY();
    }

    private void initComponents() {
    jButton1 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    side_image = new javax.swing.JPanel();

    getContentPane().setLayout(null);

    setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);
    jButton1.setText("load");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton1ActionPerformed(evt);
    }
    });

    getContentPane().add(jButton1);
    jButton1.setBounds(10, 10, 70, 25);

    jScrollPane1.setViewportView(side_image);

    getContentPane().add(jScrollPane1);
    jScrollPane1.setBounds(0, 50, 400, 300);

    pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    JFileChooser fc = new JFileChooser();
    fc.setSize(200,150);
    fc.showDialog(this, "Chose the Source image");


    this.II = Toolkit.getDefaultToolkit().createImage(fc.getSele ctedFile().getAbsolutePath());
    this.img.set_Image(this.II);
    this.img.setImgWidth(this.II.getWidth(this));
    this.img.setImgHeight(this.II.getHeight(this));
    this.img.setPreferredSize(new Dimension(this.img.getImgWidth(), this.img.getImgHeight()) );

    this.side_image.add(this.img);
    this.img.setBounds(0,0, this.img.getImgWidth(), this.img.getImgHeight());
    this.side_image.setPreferredSize(this.img.getPrefe rredSize());

    this.jScrollPane1.setHorizontalScrollBarPolicy(Scr ollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    this.jScrollPane1.setVerticalScrollBarPolicy(Scrol lPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

    sbH = this.jScrollPane1.getHorizontalScrollBar();
    sbV = this.jScrollPane1.getVerticalScrollBar();

    this.validate();
    this.repaint();

    this.side_image.addMouseMotionListener(new java.awt.event.MouseMotionAdapter(){
    public void mouseDragged(java.awt.event.MouseEvent evt){
    side_imageMouseDragged(evt);
    }
    });

    this.side_image.addMouseListener(new java.awt.event.MouseAdapter(){
    public void mousePressed(java.awt.event.MouseEvent evt){
    side_imageMousePressed(evt);
    }
    });

    }


    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new MyDragImage().setVisible(true);
    }
    });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel side_image;

    }



    ///////------------- extended JLabel per la immagine

    package mydragphoto;

    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import javax.swing.JLabel;


    public class ImageLabel extends JLabel{

    public Image bgimage = null;
    private int imgwidth = 0;
    private int imgheight = 0;

    public ImageLabel() {
    super();
    }


    public void set_Image (Image img) {
    if(img != null){
    this.bgimage = img;

    this.setImgWidth(img.getWidth(this));
    this.setImgHeight(img.getHeight(this));

    MediaTracker mt = new MediaTracker(this);
    mt.addImage(this.bgimage, 0);

    try{
    mt.waitForAll();
    } catch (InterruptedException e){
    e.printStackTrace();
    }
    }
    }

    public void setImgWidth(int width){ this.imgwidth = width;}

    public void setImgHeight(int height){ this.imgheight = height;}

    public int getImgWidth(){ return this.imgwidth; }

    public int getImgHeight(){ return this.imgheight; }

    public void paint(Graphics g) {
    super.paint(g);

    if(bgimage != null){
    g.drawImage(bgimage, 0, 0, this.imgwidth, this.imgheight, this);

    }

    }

    }

  2. #2

    rinnovo l'appello

    rinnovo il mio appello per qualche buon'anima

    rinnovo anche una spiegazione che potrebe essere non stata chiara:

    il drag implementato nel codice che ho postato provoca un movimento dell'immagine lento(prima soluzione [commentata]) o a scatti/'frilla'(soluzione corrente) (o viceversa ...non mi ricordo) e non corrispondente con l'esatto spostamento in coordinate del mouse.

    lo so è una cosa un po complicata, ma
    Qualcuno potrebbe darmi una mano?
    grazie
    Andrea

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.