2016-05-18 14 views
0

WindowsとOSXの両方で使用される大きなJavaアプリケーションがあります。 2つのJTablesの間でカスタムドラッグアンドドロップを実行します。ドラッグカーソルがOSXに表示されない

Windowsでは、これは完全に機能します。ターゲットJTableの上にドラッグすると、カスタムカーソルが表示されます。

Macでは、カスタムカーソルが表示されません。代わりに、ドラッグを開始すると灰色の四角形(境界線のみ)が表示されます。この矩形は、表の列の幅と表の高さです。私たちのロギングは、dragOver()およびdropActionChanged()メソッドが呼び出されていることを示しており、カスタムカーソルを設定しています。ただ表示されることはありません。

カスタムカーソルコードを無効にすると、同じボックスが表示されますが、中央に円/スラッシュアイコンも表示されます。

私は奇妙なボックスを取り除き、カスタムカーソルを表示したいと思います。コードから

抜粋:さらにたくさんのチェックと分析した後

private class FileTransferHandler extends TransferHandler { 

    private static final long   serialVersionUID  = 1L; 
    private final Logger    log    = LogManager.getLogger(); 
    private final CursorDragSourceListener dragSourceListener = new CursorDragSourceListener(); 

    // Left out the Drop handling code that was here 

    @Override 
    public int getSourceActions(final JComponent c) { 
     log.debug("FileTransferHandler.getSourceAction: "); 
     return COPY | MOVE; 
    } 

    @Override 
    protected Transferable createTransferable(final JComponent c) { 
     log.debug("FileTransferHandler.createTransferable:"); 
     List<iFilePage> pages = new ArrayList<iFilePage>(); 

     // Left out the code that builds the pages list 

     DragSource.getDefaultDragSource().addDragSourceListener(dragSourceListener); 
     dragSourceListener.setCursorChoice(pages.size() == 1); 

     return new FilePageTransferable(pages); 
    } 

    @Override 
    protected void exportDone( final JComponent c, 
         final Transferable t, 
         final int action) { 
     log.debug("FileTransferHandler.exportDone: {}", action, t); 
     tblFixed.getSelectionModel().clearSelection(); 
     DragSource.getDefaultDragSource().removeDragSourceListener(dragSourceListener); 
     return; 
    } 
} 

private static class CursorDragSourceListener implements DragSourceListener { 
    private Cursor singlePage  = null; 
    private Cursor multiPage  = null; 
    private Cursor badSinglePage = null; 
    private Cursor useCursor  = null; 
    private boolean useSingle  = false; 

    public CursorDragSourceListener() { 
     Toolkit toolkit = Toolkit.getDefaultToolkit(); 
     URL url; 
     String name; 
     Image img; 

     url = FileUtils.getResourceURL("/images/page.png"); 
     name = "DragPage"; 
     img = toolkit.createImage(url); 
     singlePage = toolkit.createCustomCursor(img, new Point(16, 16), name); 

     url = FileUtils.getResourceURL("/images/badpage_stack.png"); 
     name = "DragBadPage"; 
     img = toolkit.createImage(url); 
     badSinglePage = toolkit.createCustomCursor(img, new Point(16, 16), name); 

     url = FileUtils.getResourceURL("/images/page_stack.png"); 
     name = "DragPageStack"; 
     img = toolkit.createImage(url); 
     multiPage = toolkit.createCustomCursor(img, new Point(16, 16), name); 

     return; 
    } 

    public void setCursorChoice(final boolean single) { 
     log.debug("CursorDragSourceListener.setCursorChoice: {}", single); 
     useSingle = single; 
     if (useSingle) { 
      useCursor = singlePage; 
     } else { 
      useCursor = multiPage; 
     } 
     return; 
    } 

    @Override 
    public void dropActionChanged(final DragSourceDragEvent dsde) { 
     log.debug("CursorDragSourceListener.dropActionChanged: {}", dsde.getDropAction(), useSingle); 

     if (dsde.getDropAction() == 2) { 
      if (!useSingle) { 
       useCursor = badSinglePage; 
      } else { 
       useCursor = singlePage; 
      } 

     } else { 
      if (useSingle) { 
       useCursor = singlePage; 
      } else { 
       useCursor = multiPage; 
      } 
     } 

     dsde.getDragSourceContext().setCursor(useCursor); 
     return; 
    } 

    @Override 
    public void dragOver(final DragSourceDragEvent dsde) { 

     try { 
      Object x = dsde.getDragSourceContext().getTransferable() 
         .getTransferData(DataFlavor.javaFileListFlavor); 
      log.trace("CursorDragSourceListener.dragOver: {}", (x != null) ? x.getClass().getSimpleName() : "null"); 

      if (x instanceof ArrayList) { 
       dsde.getDragSourceContext().setCursor(useCursor); 
      } 

     } catch (Exception e) { 
      log.error("CursorDragSourceListener.dragOver:", e); 
     } 
    } 

    @Override 
    public void dragExit(final DragSourceEvent dse) { 
    } 

    @Override 
    public void dragEnter(final DragSourceDragEvent dsde) { 
    } 

    @Override 
    public void dragDropEnd(final DragSourceDropEvent dsde) { 
    } 

} 

答えて

0

、それが私たちのカスタム選択モデルは、OSX上で、この問題を引き起こしていたことが判明しました。 行全体だけでなく、複数の個別セルを選択できる選択モデルがあります。 getMinSelectionindex()メソッドとgetMaxSelectionIndex()メソッドはダミーデータを返しました。

これはMS Winでは正常に動作しますが、明らかにJTableのOSXドラッグアンドドロップでこれらの呼び出しが使用されます。

妥当な値を返すようにコードを修正した後は、選択ボックスの高さはテーブルの高さにはなりません。

カスタムカーソルはほとんどの場合表示されますが、明らかな理由がなくてもランダムに消えます。

関連する問題