如何隐藏 Mac/OSX 拖放 JTable 选择框
Posted
技术标签:
【中文标题】如何隐藏 Mac/OSX 拖放 JTable 选择框【英文标题】:How to hide Mac/OSX Drag and Drop JTable selection frame 【发布时间】:2012-10-08 00:53:42 【问题描述】:在 JTable 上执行拖放操作时,在拖动时会出现所选单元格(选择框)的轮廓。我怎样才能覆盖该行为而不显示任何内容,但可能是一个特殊的光标?
在 Windows 和 OSX 中运行以下代码显示了我想要覆盖的行为!
import java.awt.BorderLayout;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
public class GestureTest
extends
JFrame
implements
DragGestureListener
private final DragSource ds;
private final JTable jl;
private static final Object[][] ITEMS = "Java" , "C" , "C++" , "Lisp" ,
"Perl" , "Python" ;
public GestureTest()
super("Gesture Test");
setSize(200, 150);
addWindowListener(new WindowAdapter()
@Override
public void windowClosing(final WindowEvent we)
System.exit(0);
);
jl = new JTable(ITEMS, new Object[] "Langs" );
jl.setDragEnabled(true);
jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
getContentPane().add(new JScrollPane(jl), BorderLayout.CENTER);
ds = new DragSource();
// final DragGestureRecognizer dgr =
ds.createDefaultDragGestureRecognizer(
jl, DnDConstants.ACTION_MOVE, this);
setVisible(true);
@Override
public void dragGestureRecognized(final DragGestureEvent dge)
System.out.print("dragGestureRecognized");
public static void main(final String args[])
new GestureTest();
【问题讨论】:
问题的屏幕截图可能会有所帮助 @NickRippe:我添加了截图here;如果不深入研究 Cocoa/Java 框架,我没有办法改变它。 我同意垃圾神,我认为这是操作系统特定的问题...另一个问题是,您如何执行 d'n'd 操作?通过可转移 API 还是通过核心 d'n'd API? 【参考方案1】:我找到了一个解决方案,尽管您必须自己编写更多的 dnd 处理。
首先禁用JTable自己的dnd处理:jl.setDragEnabled(false);
那么你可以使用dragGestureRecognized
方法下面的代码来自己调用startDrag
。
重要的是empty
图像。在此处使用null
将导致操作系统显示特定于操作系统的图像(Windows 为无,OS X 为灰色框),在此处显式设置图像将导致显示该图像(在我们的示例中为空的 1x1 像素图像)。
@Override
public void dragGestureRecognized(final DragGestureEvent dge)
System.out.print("dragGestureRecognized");
Transferable transferable = new Transferable()
@Override
public boolean isDataFlavorSupported(DataFlavor flavor)
return true;
@Override
public DataFlavor[] getTransferDataFlavors()
return new DataFlavor[] DataFlavor.stringFlavor ;
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
return "Hello world!";
;
BufferedImage empty = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
dge.startDrag(null, empty, new Point(), transferable, null);
【讨论】:
以上是关于如何隐藏 Mac/OSX 拖放 JTable 选择框的主要内容,如果未能解决你的问题,请参考以下文章