2016-08-22 1 views
1

Я следил за приведенным ниже учебным пособием. В разделе Extending Default DnD Support этого руководства есть приложение с JTextArea, a JList и JTable.Перетащите текст из JLabel в JTable с помощью transferHandler

И он отлично работает. Кроме того, я использовал JLabel. Я установил обработчик передачи этой метки как:

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

Когда я вытащил этот ярлык на стол, она не принимает его. Но он работает для строки из текстовой области.

Как перетащить текст с этикетки на стол?

+1

Для лучшей помощи в ближайшее время отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

ответ

2
new TransferHandler("text"); 

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

реализован этот класс для обеспечения поведения по умолчанию переноса свойства компонента просто путем указания имени правильного в конструкторе. Например, чтобы перенести цвет переднего плана с одного компонента на другой или через буфер обмена или операцию перетаскивания, 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

Прошу прощения. Я забыл упомянуть об этом. Я сделал это. –

Смежные вопросы