2016-08-22 7 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を使用します。

JTablesetText(String)の方法がない。したがって、JTableのセルにデータをインポートするには、TransferHander#importData(...)メソッドをオーバーライドする必要があります。

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

すみません。私はそれに言及するのを忘れた。私はそれをしました。 –

関連する問題