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);
}
}
}