Java實現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】
本文實例講述了Java實現(xiàn)的可選擇及拖拽圖片的面板功能。分享給大家供大家參考,具體如下:
今天在論壇上看到帖子希望能在 Swing 中實現(xiàn)像拖地圖一樣拖拽圖片。這里是一個最簡單的實現(xiàn),提供了一個基本思路。
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 {
/**
* 構(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("chabaoo.cn 雙擊打開圖片,然后拖拽");
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), // 每次拖拽開始時圖片的位置(也就是上次拖拽后的位置)
mouseStartposition; // 每次拖拽開始時鼠標(biāo)的位置
ImagePanel() {
addMouseListener(new MouseListener() {
// 雙擊鼠標(biāo)時打開圖片
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
openImage();
}
}
// 按下鼠標(biāo)時,更改狀態(tài),并且記錄拖拽起始位置。
public void mousePressed(MouseEvent e) {
if (status == DragStatus.Ready) {
status = DragStatus.Dragging;
mouseStartposition = e.getPoint();
imageStartposition.setLocation(imagePosition.getLocation());
}
}
// 松開鼠標(biāo)時更改狀態(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 有拖拽事件,在這個事件中移動圖片位置
public void mouseDragged(MouseEvent e) {
if (status == DragStatus.Dragging) {
moveImage(e.getPoint());
}
}
public void mouseMoved(MouseEvent e) {
}
});
}
/**
* 移動圖片。實際上畫圖工作在 paintComponent() 中進行,這里只是計算圖片位置,然后調(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();
}
// 打開圖片
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)建打開文件對話框
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
}
}
運行效果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
SpringAop切入點execution表達(dá)式的深入講解
Spring AOP 可能會經(jīng)常使用 execution切入點指示符,下面這篇文章主要給大家介紹了關(guān)于SpringAop切入點execution表達(dá)式的相關(guān)資料,需要的朋友可以參考下2021-08-08
如何取消IDEA中的項目和Git倉庫的關(guān)聯(lián)
這篇文章介紹了一種取消已經(jīng)開啟代碼控制的項目與Git倉庫關(guān)聯(lián)的簡單方法,首先,在IntelliJ IDEA中打開項目,刪除.idea目錄下的vcs.xml文件,這樣IDE界面上的Git圖標(biāo)就會消失,接下來,打開項目所在位置,通過文件管理器啟用“顯示隱藏的項目”選項2024-10-10
Java隨機值設(shè)置(java.util.Random類或Math.random方法)
在編程中有時我們需要生成一些隨機的字符串作為授權(quán)碼、驗證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關(guān)于Java隨機值設(shè)置的相關(guān)資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下2024-08-08
spring boot 不連接數(shù)據(jù)庫啟動的解決
這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫啟動的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
java開發(fā)分布式服務(wù)框架Dubbo調(diào)用過程
這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo調(diào)用過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11

