2016-08-22 39 views
1

我按照下面提到的教程。在本教程的主題Extending Default DnD Support下,有一個應用程序,其中JTextAreaJListJTable使用transferHandler將文本從JLabel拖放到JTable

它完美的工作。另外我用了一個JLabel。我將這個標籤的傳輸處理程序設置爲:

jLabel1.setTransferHandler(new TransferHandler("text")); 

當我將此標籤拖放到表上時,它不接受它。但它適用於來自文本區域的字符串。

如何將標籤上的文本拖放到表格上?

+1

爲了更好地提供幫助,請發佈[MCVE]或[簡短自包含正確示例](http://www.sscce.org/)。 –

回答

2
new TransferHandler("text"); 

https://docs.oracle.com/javase/8/docs/api/javax/swing/TransferHandler.html

這個類實現通過指定正確的名稱來提供傳遞組件屬性的默認行爲ty在構造函數中。例如,要通過剪貼板或拖放操作將前景色從一個組件傳輸到另一個組件,可以使用字符串「foreground」構造TransferHandler。內置的支持將使用由getForeground返回的顏色作爲傳輸的源,並使用setForeground作爲傳輸的目標。

JTable還沒有setText(String)方法。因此,您需要覆蓋TransferHander#importData(...)方法以將數據導入JTable的單元格中。

import java.awt.*; 
import java.awt.datatransfer.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class DnDTest { 
    public JComponent makeUI() { 
    JTable table = new JTable(5, 3); 
    table.setAutoCreateRowSorter(true); 
    table.setTransferHandler(new ToTransferHandler()); 

    JLabel label = new JLabel("aaaaaaaaaaaa"); 
    label.setTransferHandler(new TransferHandler("text")); 
    label.addMouseListener(new MouseAdapter() { 
     @Override public void mousePressed(MouseEvent e) { 
     JComponent c = (JComponent) e.getSource(); 
     c.getTransferHandler().exportAsDrag(c, e, TransferHandler.COPY); 
     } 
    }); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(new JScrollPane(table)); 
    p.add(label, BorderLayout.SOUTH); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new DnDTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 

//@see https://docs.oracle.com/javase/tutorial/uiswing/dnd/dropactiondemo.html 
class ToTransferHandler extends TransferHandler { 
    @Override public boolean canImport(TransferHandler.TransferSupport support) { 
    return getPropertyDataFlavor(String.class, support.getDataFlavors()) != null; 
    } 
    @Override public boolean importData(TransferHandler.TransferSupport support) { 
    // if we can't handle the import, say so 
    if (!canImport(support)) { 
     return false; 
    } 

    DataFlavor flavor = getPropertyDataFlavor(String.class, support.getDataFlavors()); 

    // fetch the data and bail if this fails 
    String data; 
    try { 
     data = (String) support.getTransferable().getTransferData(flavor); 
    } catch (UnsupportedFlavorException | java.io.IOException e) { 
     return false; 
    } 

    JTable.DropLocation dl = (JTable.DropLocation) support.getDropLocation(); 
    JTable table = (JTable) support.getComponent(); 
    table.setValueAt(data, dl.getRow(), dl.getColumn()); 
    return true; 
    } 
    //@see TransferHandler.java private DataFlavor getPropertyDataFlavor(...) { 
    private DataFlavor getPropertyDataFlavor(Class<?> k, DataFlavor[] flavors) { 
    for (int i = 0; i < flavors.length; i++) { 
     DataFlavor flavor = flavors[i]; 
     if ("application".equals(flavor.getPrimaryType()) && 
      "x-java-jvm-local-objectref".equals(flavor.getSubType()) && 
      k.isAssignableFrom(flavor.getRepresentationClass())) { 
     return flavor; 
     } 
    } 
    return null; 
    } 
} 
+0

非常感謝!這幫助我整潔! :) –

1

看來你需要一個鼠標事件處理程序手動添加到標籤要做到這一點:

jLabel1.addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent evt) { 
    JComponent comp = (JComponent) evt.getSource(); 
    TransferHandler th = comp.getTransferHandler(); 

    th.exportAsDrag(comp, evt, TransferHandler.COPY); 
    } 
}); 

來源:http://www.java2s.com/Tutorial/Java/0240__Swing/AddingDragandDropSupporttoaJLabelComponent.htm

+0

我很抱歉。我忘了提及它。我已經做到了。 –