本文實例講述了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;/** * 在窗體上拖拽圖片。使用方法:雙擊窗體空白處將會彈出打開圖片對話框。打開圖片後可以在窗體上拖拽圖片。 */@SuppressWarnings("serial")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("www.VeVB.COm 雙擊打開圖片,然後拖拽"); frame.setVisible(true); }}/** * 能夠拖拽圖片的面板*/@SuppressWarnings("serial")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 }}運行效果:
更多關於java算法相關內容感興趣的讀者可查看本站專題:《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。