Java實(shí)現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】
本文實(shí)例講述了Java實(shí)現(xiàn)的可選擇及拖拽圖片的面板功能。分享給大家供大家參考,具體如下:
今天在論壇上看到帖子希望能在 Swing 中實(shí)現(xiàn)像拖地圖一樣拖拽圖片。這里是一個(gè)最簡(jiǎn)單的實(shí)現(xiàn),提供了一個(gè)基本思路。
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; /** * 在窗體上拖拽圖片。使用方法:雙擊窗體空白處將會(huì)彈出打開(kāi)圖片對(duì)話框。打開(kāi)圖片后可以在窗體上拖拽圖片。 */ @SuppressWarnings("serial") public class DragingFrame extends JFrame { /** * 構(gòu)造函數(shù) * * @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.dbjr.com.cn 雙擊打開(kāi)圖片,然后拖拽"); frame.setVisible(true); } } /** * 能夠拖拽圖片的面板 */ @SuppressWarnings("serial") class ImagePanel extends JPanel { private DragStatus status = DragStatus.Ready; // 拖拽狀態(tài) private Image image; // 要顯示的圖片 private Point imagePosition = new Point(0, 0), // 圖片的當(dāng)前位置 imageStartposition = new Point(0, 0), // 每次拖拽開(kāi)始時(shí)圖片的位置(也就是上次拖拽后的位置) mouseStartposition; // 每次拖拽開(kāi)始時(shí)鼠標(biāo)的位置 ImagePanel() { addMouseListener(new MouseListener() { // 雙擊鼠標(biāo)時(shí)打開(kāi)圖片 public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { openImage(); } } // 按下鼠標(biāo)時(shí),更改狀態(tài),并且記錄拖拽起始位置。 public void mousePressed(MouseEvent e) { if (status == DragStatus.Ready) { status = DragStatus.Dragging; mouseStartposition = e.getPoint(); imageStartposition.setLocation(imagePosition.getLocation()); } } // 松開(kāi)鼠標(biāo)時(shí)更改狀態(tài) 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 有拖拽事件,在這個(gè)事件中移動(dòng)圖片位置 public void mouseDragged(MouseEvent e) { if (status == DragStatus.Dragging) { moveImage(e.getPoint()); } } public void mouseMoved(MouseEvent e) { } }); } /** * 移動(dòng)圖片。實(shí)際上畫(huà)圖工作在 paintComponent() 中進(jìn)行,這里只是計(jì)算圖片位置,然后調(diào)用該方法。 * * @param point 當(dāng)前的鼠標(biāo)位置 */ private void moveImage(Point point) { // 圖片的當(dāng)前位置等于圖片的起始位置加上鼠標(biāo)位置的偏移量。 imagePosition.setLocation( imageStartposition.getX() + (point.getX() - mouseStartposition.getX()), imageStartposition.getY() + (point.getY() - mouseStartposition.getY()) ); repaint(); } // 打開(kāi)圖片 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(); } } } // 創(chuàng)建打開(kāi)文件對(duì)話框 private JFileChooser createFileChooser() { JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("請(qǐng)選擇圖片文件..."); 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 } }
運(yùn)行效果:
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
SpringAop切入點(diǎn)execution表達(dá)式的深入講解
Spring AOP 可能會(huì)經(jīng)常使用 execution切入點(diǎn)指示符,下面這篇文章主要給大家介紹了關(guān)于SpringAop切入點(diǎn)execution表達(dá)式的相關(guān)資料,需要的朋友可以參考下2021-08-08如何取消IDEA中的項(xiàng)目和Git倉(cāng)庫(kù)的關(guān)聯(lián)
這篇文章介紹了一種取消已經(jīng)開(kāi)啟代碼控制的項(xiàng)目與Git倉(cāng)庫(kù)關(guān)聯(lián)的簡(jiǎn)單方法,首先,在IntelliJ IDEA中打開(kāi)項(xiàng)目,刪除.idea目錄下的vcs.xml文件,這樣IDE界面上的Git圖標(biāo)就會(huì)消失,接下來(lái),打開(kāi)項(xiàng)目所在位置,通過(guò)文件管理器啟用“顯示隱藏的項(xiàng)目”選項(xiàng)2024-10-10Java隨機(jī)值設(shè)置(java.util.Random類(lèi)或Math.random方法)
在編程中有時(shí)我們需要生成一些隨機(jī)的字符串作為授權(quán)碼、驗(yàn)證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機(jī)值設(shè)置的相關(guān)資料,主要用的是java.util.Random類(lèi)或Math.random()方法,需要的朋友可以參考下2024-08-08spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決
這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫(kù)啟動(dòng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java?中向?Arraylist?添加對(duì)象的示例代碼
本文介紹了如何在 Java 中向 ArrayList 添加對(duì)象,并提供了示例和注意事項(xiàng),通過(guò)掌握這些知識(shí),讀者可以在自己的 Java 項(xiàng)目中有效地使用 ArrayList 來(lái)存儲(chǔ)和操作對(duì)象,需要的朋友可以參考下2023-11-11java開(kāi)發(fā)分布式服務(wù)框架Dubbo調(diào)用過(guò)程
這篇文章主要為大家介紹了java開(kāi)發(fā)分布式服務(wù)框架Dubbo調(diào)用過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11