2015-09-10 40 views
0

我想處理其他應用程序中的File Drops。 現在我正處於可以區分不同DataFlavors並接受正確類型的地步。整個JFrame上的TransferHandler

這裏是源代碼,我有工作:

private TransferHandler transferehandler = new TransferHandler(){ 
     @Override 
     public boolean canImport(TransferHandler.TransferSupport support) { 
     if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 

      boolean copySupported = (MOVE & support.getSourceDropActions()) == MOVE; 

      if (!copySupported) { 
       return false; 
      } 

      support.setDropAction(MOVE); 


     return true; 
     } 

這第一部分是建立我canImport,以檢查文件支持MOVE選項,並檢查它的文件。

@Override 
     public boolean importData(TransferHandler.TransferSupport support){ 
      if(!canImport(support)) 
       return false; 
      Transferable t = support.getTransferable(); 
      try { 
       List<File> l = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor); 
       System.out.println(l); 
      } catch (UnsupportedFlavorException | IOException e) { 
       e.printStackTrace(); 
       return false; 
      } 
      return true; 
     } 
    }; 

這裏是我執行importData方法。出於測試目的,我正在打印每個文件,這些文件被拖拽到Component中,該文件有TransferHandler

通過閱讀JavaDocs我只有到我可以處理從不同JPanels滴下的點。 但其實我是想這樣創造的東西:

It should look like this

我希望你明白我的意思。

+0

如何將您的DnD處理程序直接設置爲主頂級容器 - 內容窗格? 'JFramage.getContentPane()' – Antoniossss

+0

你不能直接將它設置爲'Content Pane',但是如果將它添加到JFrame中,只有上面的'bar'變成可丟棄的,實際上我可以將TransfereHandler設置爲每個單獨的Component,但是這將是荒謬的 – Einstein

回答

2

在這裏你可以在任何子組件上使用DnD(就像我在評論中寫的那樣)。您可以將它們都放在紅色(父級內容窗格)和藍色(子級)組件上。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.TransferHandler; 


public class TransferableJFrame { 



    public static void main(String[] args) { 
     JFrame f=new JFrame(); 

     f.setSize(1000, 1000); 

     JPanel contentPane=new JPanel(); 
     contentPane.setOpaque(true); 
     contentPane.setBackground(Color.red); 
     contentPane.setLayout(new FlowLayout()); 

     contentPane.setTransferHandler(new MyTrasnferHandler()); 


     JPanel child=new JPanel(); 
     child.setOpaque(true); 
     child.setBackground(Color.BLUE); 
     child.setPreferredSize(new Dimension (600,600)); 
     contentPane.add(child); 
     f.setContentPane(contentPane); 

     f.setLocationRelativeTo(null); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 


    } 

    private static class MyTrasnferHandler extends TransferHandler{ 
     @Override 
     public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { 
      System.out.println("we will drop here"); 
      return true; 
     } 
     @Override 
     public boolean importData(JComponent comp, Transferable t) { 
      System.out.println("Dropped"); 
      return super.importData(comp, t); 
     } 
    } 


} 
+0

Iv只是錯過了WCS Elazer(同性戀)VS Hydra寫你的例子;) – Antoniossss

+0

哦,男人很抱歉聽到這個^^但儘可能簡單,它的工作!也許甲骨文他們應該將這個小信息添加到他們的教程。像這樣的一句話:「如果將處理程序添加到父組件,它也會影響所有子組件」。 PS:星際爭霸是一款非常不錯的遊戲,但是爲了我的品位,速度有點快:D – Einstein

+0

說實話,他們做到了。很高興我可以幫助https://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html – Antoniossss