1 Kasım 2018 Perşembe

Swing TransferHandler Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.swing.TransferHandler;
JTree
JTree hedef nesne ise önce drop mode değerini atamak gerekir. Açıklaması şöyle. Böylece üzerinde drop olunca yeni bir düğüm mü eklenecek, mevcut olan mı güncellenecek belirtiriz.
When enabling drop on a component, such as a list, you need to decide how you want the drop location to be interpreted. For example, do you want to restrict the user to replacing existing entries? Do you want to only allow adding or inserting new entries? Do you want to allow both? To configure this behavior, the JList class provides the setDropMode method which supports the following drop modes.
Sonra JTree için TransferHandler nesnesini atamak gerekir. Açıklaması şöyle. Böylece gelen veriyi kabul edebilir.
As mentioned previously, the default Swing transfer handlers, such as those used by text components and the color chooser, provide the support considered to be most useful for both importing and exporting of data. However list, table, and tree do not support drop by default. The reason for this is that there is no all-purpose way to handle a drop on these components. For example, what does it mean to drop on a particular node of a JTree? Does it replace the node, insert below it, or insert as a child of that node? Also, we do not know what type of model is behind the tree — it might not be mutable.

While Swing cannot provide a default implementation for these components, the framework for drop is there. You need only to provide a custom TransferHandler that manages the actual import of data.
Şöyle yaparız.
JTree tree = new JTree();
tree.setDragEnabled(true);
tree.setDropMode(DropMode.ON_OR_INSERT);
tree.setTransferHandler(new MyTreeTransferHandler());
Export 
Export işlemi için şu metodlar kullanılır.
getSourceActions()
createTransferable()
exportDone()

Import 
Import işlemi için şu metodlar kullanılır.Bu metodlar TransferSupport sınıfını parametre olarak alırlar.

canImport()
importData()

exportAsDrag metodu
Drag drop işlemini desteklemeyen bir sınıfa bu yeteneğin eklenebilmesini sağlar. Açıklaması şöyle
...when the mouse is pressed, the transfer handler initiates the drag from the label by invoking exportAsDrag with the Copy argument:
MouseMotionAdapter veya MouseAdapter arüyüzünü gerçekleştiren bir sınıf eklenir. Bu sınıfın mouseDragged metodunda exportAsDrag () çağrısı yapılır.

Örnek
Şöyle yaparız.
class DragPanel extends JPanel {
  public DragPanel() {
    super();
  }
  public JLabel draggingLabel;
}
class Handler extends MouseAdapter {
  @Override public void mousePressed(MouseEvent e) {
    DragPanel p = (DragPanel)e.getSource();
    Component c = SwingUtilities.getDeepestComponentAt(p, e.getX(), e.getY());
    if(c!=null && c instanceof JLabel) {
      p.draggingLabel = (JLabel)c;
      p.getTransferHandler().exportAsDrag(p, e, TransferHandler.MOVE);
    }
  }
}

Hiç yorum yok:

Yorum Gönder