欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】

 更新時間:2018年01月10日 12:05:21   作者:捏造的信仰  
這篇文章主要介紹了Java實現(xiàn)的可選擇及拖拽圖片的面板功能,涉及java基于swing組件選擇與操作圖片元素的相關實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了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 {
  /**
   * 構造函數(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 雙擊打開圖片,然后拖拽");
    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), // 圖片的當前位置
      imageStartposition = new Point(0, 0),  // 每次拖拽開始時圖片的位置(也就是上次拖拽后的位置)
      mouseStartposition;           // 每次拖拽開始時鼠標的位置
  ImagePanel() {
    addMouseListener(new MouseListener() {
      // 雙擊鼠標時打開圖片
      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
          openImage();
        }
      }
      // 按下鼠標時,更改狀態(tài),并且記錄拖拽起始位置。
      public void mousePressed(MouseEvent e) {
        if (status == DragStatus.Ready) {
          status = DragStatus.Dragging;
          mouseStartposition = e.getPoint();
          imageStartposition.setLocation(imagePosition.getLocation());
        }
      }
      // 松開鼠標時更改狀態(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 當前的鼠標位置
   */
  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();
      }
    }
  }
  // 創(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
  }
}

運行效果:

更多關于java算法相關內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • SpringAop切入點execution表達式的深入講解

    SpringAop切入點execution表達式的深入講解

    Spring AOP 可能會經(jīng)常使用 execution切入點指示符,下面這篇文章主要給大家介紹了關于SpringAop切入點execution表達式的相關資料,需要的朋友可以參考下
    2021-08-08
  • 如何取消IDEA中的項目和Git倉庫的關聯(lián)

    如何取消IDEA中的項目和Git倉庫的關聯(lián)

    這篇文章介紹了一種取消已經(jīng)開啟代碼控制的項目與Git倉庫關聯(lián)的簡單方法,首先,在IntelliJ IDEA中打開項目,刪除.idea目錄下的vcs.xml文件,這樣IDE界面上的Git圖標就會消失,接下來,打開項目所在位置,通過文件管理器啟用“顯示隱藏的項目”選項
    2024-10-10
  • Java 利用遞歸實現(xiàn)鏈表的歸并排序

    Java 利用遞歸實現(xiàn)鏈表的歸并排序

    這篇文章主要介紹了Java 如何利用遞歸實現(xiàn)鏈表的歸并排序,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java隨機值設置(java.util.Random類或Math.random方法)

    Java隨機值設置(java.util.Random類或Math.random方法)

    在編程中有時我們需要生成一些隨機的字符串作為授權碼、驗證碼等,以確保數(shù)據(jù)的安全性和唯一性,這篇文章主要給大家介紹了關于Java隨機值設置的相關資料,主要用的是java.util.Random類或Math.random()方法,需要的朋友可以參考下
    2024-08-08
  • spring boot 不連接數(shù)據(jù)庫啟動的解決

    spring boot 不連接數(shù)據(jù)庫啟動的解決

    這篇文章主要介紹了spring boot 不連接數(shù)據(jù)庫啟動的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java?中向?Arraylist?添加對象的示例代碼

    Java?中向?Arraylist?添加對象的示例代碼

    本文介紹了如何在 Java 中向 ArrayList 添加對象,并提供了示例和注意事項,通過掌握這些知識,讀者可以在自己的 Java 項目中有效地使用 ArrayList 來存儲和操作對象,需要的朋友可以參考下
    2023-11-11
  • java開發(fā)分布式服務框架Dubbo調(diào)用過程

    java開發(fā)分布式服務框架Dubbo調(diào)用過程

    這篇文章主要為大家介紹了java開發(fā)分布式服務框架Dubbo調(diào)用過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • Java解壓和壓縮帶密碼的zip文件過程詳解

    Java解壓和壓縮帶密碼的zip文件過程詳解

    這篇文章主要介紹了Java解壓和壓縮帶密碼的zip文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來學習一下吧
    2019-06-06
  • java使用dom4j生成與解析xml文檔的方法示例

    java使用dom4j生成與解析xml文檔的方法示例

    這篇文章主要介紹了java使用dom4j生成與解析xml文檔的方法,結合實例形式分析了java基于dom4j操作xml節(jié)點生成xml文檔以及解析xml文檔的相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • Java中的==使用方法詳解

    Java中的==使用方法詳解

    這篇文章主要介紹了Java中“==”的使用方法,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-09-09

最新評論