在java做的画图板中,如何选中一个已经画好的图形,把它放大、缩小、移动???类似windows的画图板功能,急呀,大牛们帮帮忙

解决方案 »

  1.   

    package aa;import javax.swing.*;
    import javax.swing.filechooser.*;
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.io.File;/**  
     * 在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。  
     */
    public class DragingFrame extends JFrame { /**  
     * 构造函数  
     *  
     * @throws HeadlessException ???  
     */
    public DragingFrame() throws HeadlessException {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(new ImagePanel(), BorderLayout.CENTER);
    } // 程序入口   
    public static void main(String[] args) throws Exception {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    DragingFrame frame = new DragingFrame();
    frame.setSize(400, 300);
    frame.setLocation(300, 300);
    frame.setResizable(false);
    frame.setTitle("双击打开图片,然后拖拽");
    frame.setVisible(true);
    }
    }/**  
     * 能够拖拽图片的面板  
     */
    class ImagePanel extends JPanel { private DragStatus status = DragStatus.Ready; // 拖拽状态    private Image image; // 要显示的图片    private Point imagePosition = new Point(0, 0), // 图片的当前位置    imageStartposition = new Point(0, 0), // 每次拖拽开始时图片的位置(也就是上次拖拽后的位置)    mouseStartposition; // 每次拖拽开始时鼠标的位置    ImagePanel() {
    addMouseListener(new MouseListener() { // 双击鼠标时打开图片   
    public void mouseClicked(MouseEvent e) {
    if (e.getClickCount() == 2) {
    openImage();
    }
    } // 按下鼠标时,更改状态,并且记录拖拽起始位置。   
    public void mousePressed(MouseEvent e) {
    if (status == DragStatus.Ready) {
    status = DragStatus.Dragging;
    mouseStartposition = e.getPoint();
    imageStartposition.setLocation(imagePosition.getLocation());
    }
    } // 松开鼠标时更改状态   
    public void mouseReleased(MouseEvent e) {
    if (status == DragStatus.Dragging) {
    status = DragStatus.Ready;
    }
    } public void mouseEntered(MouseEvent e) {
    } public void mouseExited(MouseEvent e) {
    }
    }); addMouseMotionListener(new MouseMotionListener() { // Java 有拖拽事件,在这个事件中移动图片位置   
    public void mouseDragged(MouseEvent e) {
    if (status == DragStatus.Dragging) {
    moveImage(e.getPoint());
    }
    } public void mouseMoved(MouseEvent e) {
    }
    });
    } /**  
     * 移动图片。实际上画图工作在 paintComponent() 中进行,这里只是计算图片位置,然后调用该方法。  
     *  
     * @param point 当前的鼠标位置  
     */
    private void moveImage(Point point) {
    // 图片的当前位置等于图片的起始位置加上鼠标位置的偏移量。   
    imagePosition.setLocation(imageStartposition.getX()
    + (point.getX() - mouseStartposition.getX()),
    imageStartposition.getY()
    + (point.getY() - mouseStartposition.getY()));
    repaint();
    } // 打开图片   
    private void openImage() {
    System.out.println("Opening image...");
    File file = createFileChooser().getSelectedFile();
    if (file != null) {
    image = Toolkit.getDefaultToolkit()
    .getImage(file.getAbsolutePath());
    if (image != null) {
    this.repaint();
    }
    }
    } // 创建打开文件对话框   
    private JFileChooser createFileChooser() {
    JFileChooser chooser = new JFileChooser();
    chooser.setDialogTitle("请选择图片文件...");
    chooser.addChoosableFileFilter(new FileNameExtensionFilter("常用图片格式",
    "jpg", "jpeg", "gif", "png"));
    chooser.showOpenDialog(this);
    return chooser;
    } @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image != null) {
    g.drawImage(image, (int) imagePosition.getX(), (int) imagePosition
    .getY(), this);
    }
    } private enum DragStatus {
    Ready, Dragging
    }
    }
      

  2.   

    package aa;import java.io.File;import javax.swing.filechooser.FileFilter;public class FileNameExtensionFilter extends FileFilter {
    String string;
    String string2;
    String string3;
    String string4;
    String string5; public FileNameExtensionFilter(String string, String string2,
    String string3, String string4, String string5) {
    this.string = string;
    this.string2 = string2;
    this.string3 = string3;
    this.string4 = string4;
    this.string5 = string5;
    } public FileFilter FileNameExtensionFilter(String s1, String s2, String s3,
    String s4, String s5) {
    return new FileNameExtensionFilter(s1, s2, s3, s4, s5); } @Override
    public boolean accept(File f) {
    // TODO Auto-generated method stub
    return false;
    } @Override
    public String getDescription() {
    // TODO Auto-generated method stub
    return null;
    }}
      

  3.   

    我对楼主的建议就是,实时获取panel的大小,设定比例参数,再调用repaint()方法
     不知道这是否能对楼主有所启发
      

  4.   

    如果你使用了graphics或者graphics2d
    那么,我建议你使用仿射变换。AffineTransform使用这个操作非常方便,而且这个类就是用来处理图像的旋转,平移,放大,缩小。
    用不着手动去算改编后的尺寸,位置等。
    需要逻辑清晰一些。话说回来,用什么不需要逻辑清晰呢?
      

  5.   

    设置 事件侦听器,比如onmouseup ondrag 之类的
    取出变化的坐标值
    然后repaint()
      

  6.   

    能否请高手发个相关的能实现选中图形,并能移动放缩的Java画图板程序。我也是新手,想知道这个怎么解决。