程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java小例子:創建一個可拖拽圖片的面板

Java小例子:創建一個可拖拽圖片的面板

編輯:關於JAVA

今天在論壇上看到帖子希望能在 Swing 中實現像拖地圖一樣拖拽圖片。這裡是一個最 簡單的實現,提供了一個基本思路。

import javax.swing.*;

import javax.swing.filechooser.FileNameExtensionFilter;

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

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved