如何隐藏 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 选择框的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 上使用 JTable 进行拖放

JTable - 拖放

在java swing Jtable中设置隐藏字段值

如何在 Mac OSX 系统备份及恢复 Mac 数据

如何在Mac OSX系统下安装Tomcat

如何在Mac OSX系统下安装Tomcat