2012-09-16 6 views
2

자바에서 이미지를 편집하는 프로그램을 만들고 있습니다. JPanel에 사용자 데스크톱에서 이미지를 드래그하고 JPanel의 배경으로 드래그 한 이미지를 설정할 수 있는지 궁금합니다. Java로 가능합니까? 그렇다면 어떻게해야할까요?이미지 드래그 앤 드롭

+2

: 이것은가 TransferHandler로를 추가하고 오전 패널은 배경으로 이미지를 그립니다

import java.awt.Cursor; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.JComponent; import javax.swing.TransferHandler; public class ImageTransferHandler extends TransferHandler { private static final DataFlavor FILE_FLAVOR = DataFlavor.javaFileListFlavor; private MainPanel mainPanel; public ImageTransferHandler(MainPanel panel) { mainPanel = panel; } /** * The method to handle the transfer between the source of data and the * destination, which is in our case the main panel. */ public boolean importData(JComponent c, Transferable t) { if (canImport(c, t.getTransferDataFlavors())) { if (transferFlavor(t.getTransferDataFlavors(), FILE_FLAVOR)) { try { List<File> fileList = (List<File>) t.getTransferData(FILE_FLAVOR); if (fileList != null && fileList.toArray() instanceof File[]) { File[] files = (File[]) fileList.toArray(); mainPanel.addFiles(files); } return true; } catch (IOException e) { e.printStackTrace(); } catch (UnsupportedFlavorException ex) { ex.printStackTrace(); } } } return false; } /** * Returns the type of transfer actions to be supported. */ public int getSourceActions(JComponent c) { return COPY_OR_MOVE; } /** * Specifies the actions to be performed after the data has been exported. */ protected void exportDone(JComponent c, Transferable data, int action) { c.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Returns true if the specified flavor is contained in the flavors array, * false otherwise. */ private boolean transferFlavor(DataFlavor[] flavors, DataFlavor flavor) { boolean found = false; for (int i = 0; i < flavors.length && !found; i++) { found = flavors[i].equals(flavor); } return found; } /** * Returns true if the component can import the specified flavours, false * otherwise. */ public boolean canImport(JComponent c, DataFlavor[] flavors) { for (int i = 0; i < flavors.length; i++) { if (FILE_FLAVOR.equals(flavors[i])) { return true; } } return false; } } 

:

TransferHandler의 구현 나는 아직이 일을 혼자하지 않았다. 자바 드래그 앤 드롭 자습서를 인터넷 검색 및 평가 해 보셨습니까? 만약 내가이 기능을 원한다면, 내가 어디에서 시작하는지, 그리고 물론 stackoverflow를 검색 할 것이다. 행운을 빌어 요! –

+0

편집 : 내가보기에 더 어려워 보입니다. 다시 말하지만, 그것은 불가능한 것처럼 보이지 않지만, 아직 간단한 해결책을 찾지 못했습니다. –

+0

이미지 편집기 인 경우 선택한 이미지가 배경의 배경으로 설정되는 이유는 무엇입니까? –

답변

6

짧은 대답은 : 가능합니다.

이 작업을 수행하는 방법은 여러 가지가 있습니다. 가장 단순한 코드 인 이미지 파일을 어딘가에서 스윙 응용 프로그램으로 드래그합니다. 그러나 이미지 편집기에서 클립 보드로 이미지를 복사하여 붙여 넣을 수도 있지만, 필요하지는 않습니다. 이 두 번째 사용 사례를 구현하려면 예제에 나와있는 DataFlavor.javaFileListFlavor 대신 DataFlavor.imageFlavor을 사용해야합니다. 따라서 아래 코드를 테스트하려면 MainPanel의 인스턴스를 컨테이너에 추가하고 앱이 실행되면 이미지 파일을 패널로 드래그하십시오. 하지만, 나는 그것이 가능하다고 생각

public class MainPanel extends JPanel { 
    private Image image; 

    MainPanel() { 
     setTransferHandler(new ImageTransferHandler(this)); 
    } 

    void addFiles(File[] files) { 
     for (File file : files) { 
      try { 
       image = ImageIO.read(file); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     if (image != null) { 
      repaint(); 
     } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLUE); 
     int width = getWidth(); 
     int height = getHeight(); 
     drawImage((Graphics2D) g, width, height); 
    } 

    private void drawImage(Graphics2D g2, int width, int height) { 
     if (image != null) { 
      g2.drawImage(image, 0, 0, width, height, null); 
     } else { 
      g2.drawRect(10, 10, width - 20, height - 20); 
     } 
    } 
}