作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想通过 O.Reilly-Swing.Hacks 的预览实现简单的 JComponent-Drag-and-Drop Hack 69. Translucent Drag-and-Drop .我的问题是如果 TransferHandler 开始拖动 MouseMotionListener 停止执行 mouseDragged()。
这是一个小示例代码:
一个带有绿色和红色边的小窗口。绿色的 Side 不开始拖动,总是执行 mouseDragged() 但 exportDone() 永远不会到达。
红色方通过 exportAsDrag() 开始拖动,但之后 mouseDragged() 将不再起作用。
public class Drag extends JPanel implements Transferable, MouseMotionListener, MouseListener {
public Drag() {
this.setTransferHandler( new TransferHandler() {
@Override
protected Transferable createTransferable( JComponent c ) {
return (Drag)c;
}
@Override
public boolean canImport( JComponent comp, DataFlavor[] transferFlavors ) {
return false;
}
@Override
public int getSourceActions( JComponent c ) {
return MOVE;
}
@Override
protected void exportDone( JComponent source, Transferable data, int action ) {
super.exportDone( source, data, action );
System.out.println( "done" );
}
} );
this.setPreferredSize( new Dimension( 200, 100 ) );
this.addMouseMotionListener( this );
this.addMouseListener( this );
}
@Override
public void mouseDragged( MouseEvent e ) {
System.out.println( "drag" );
}
@Override
public void mouseMoved( MouseEvent e ) { }
@Override
public void mousePressed( MouseEvent e ) {
if( e.getX() > getWidth() / 2 ) {
System.out.println( "EXPORT" );
this.getTransferHandler().exportAsDrag( this, e, TransferHandler.MOVE );
} else {
System.out.println( "no Export" );
}
}
@Override
public void paint( Graphics g ) {
super.paint( g );
g.setColor( Color.GREEN );
g.fillRect( 0, 0, getWidth() / 2, getHeight() );
g.setColor( Color.RED );
g.fillRect( getWidth() / 2, 0, getWidth(), getHeight() );
}
public boolean isDataFlavorSupported( DataFlavor flavor ) {
return false;
}
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {};
}
public Object getTransferData( DataFlavor flavor ) throws UnsupportedFlavorException, IOException {
return new Object();
}
@Override
public void mouseClicked( MouseEvent e ) { }
@Override
public void mouseEntered( MouseEvent e ) { }
@Override
public void mouseExited( MouseEvent e ) { }
@Override
public void mouseReleased( MouseEvent e ) { }
static public void main( String[] s ) {
JFrame f = new JFrame();
f.setSize( 200, 200 );
f.getContentPane().setLayout( new BorderLayout() );
Drag d = new Drag();
f.getContentPane().add( d, BorderLayout.NORTH );
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setVisible( true );
}
最佳答案
开始拖动操作后,运动事件将不会作为普通的鼠标拖动事件进行分派(dispatch)。在拖动过程中,当鼠标移动时会触发 DragSourceDragEvent。以下示例将在拖动红色区域时打印“DRAGMOUSEMOVED”。只需将下面的源代码粘贴到您的构造函数中即可。 DragSourceDragEvent 具有大多数 MouseEvent 方法,因此它应该是一个不错的选择。
DragSource.getDefaultDragSource().addDragSourceMotionListener(new DragSourceMotionListener() {
@Override
public void dragMouseMoved(DragSourceDragEvent dsde) {
System.out.println("DRAGMOUSEMOVED");
}
});
关于java - 为什么 DragHandler exportAsDrag 禁用我的 MouseMotionListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886689/
我想通过 O.Reilly-Swing.Hacks 的预览实现简单的 JComponent-Drag-and-Drop Hack 69. Translucent Drag-and-Drop .我的问题
我是一名优秀的程序员,十分优秀!