jlabel上のアイコンから画像をドラッグして、別のアイコン上の別のアイコンにドロップしたいとします。問題は、ドラッグアンドドロップTransferhandlerメソッドのいくつかの実装が呼び出されていないようで、私は最初のjlabelのアイコンからイメージを取得できないということです。私のコードでこの問題を見つけることを願っています。アイコンの画像をJLabelから別の画像に転送できません
class dndHandler extends TransferHandler implements Transferable {
private final DataFlavor flavors[] = { DataFlavor.imageFlavor };
private Image image;
@Override
public int getSourceActions(JComponent c) {
System.out.println("test"); // Does not work
return TransferHandler.COPY;
}
@Override
public Transferable createTransferable(JComponent comp) {
System.out.println("test"); // Does not work
image = null;
image = (Image)((ImageIcon) (((JLabel)comp).getIcon())).getImage(); //We transfer image //image stays null
return this;
}
@Override
public boolean canImport(JComponent comp, DataFlavor flavor[]) {
if (!(comp instanceof JLabel)) {
return false;
}
System.out.println("test"); //It works here
return true;
}
@Override
public boolean importData(JComponent comp, Transferable t) {
if (comp instanceof JLabel) {
System.out.println(((JLabel)comp).getName()); //It works but the image is null
((JLabel)comp).setIcon(new ImageIcon(image)); //The label stays empty
return true;
}
return false;
}
@Override
public Object getTransferData(DataFlavor flavor) {
if (isDataFlavorSupported(flavor)) {
return image;
}
return null;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavors[0].equals(flavor);
}
}
MouseListener specialListener = new SpecialDragMouseAdapter();
class SpecialDragMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent evt) {
JComponent comp = (JComponent)evt.getSource();
TransferHandler th = comp.getTransferHandler();
// Start the drag operation
th.exportAsDrag(comp, evt, TransferHandler.COPY);
}
}
public class PrincipalFrame extends javax.swing.JFrame {
TransferHandler dropHandler = new dndHandler();
public PrincipalFrame()
{
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
label1.setName("label "+i+"-"+j);
label1.setSize(50,50);
label1.setBorder(BorderFactory.createLineBorder(java.awt.Color.black));
label1.setIcon(new ImageIcon("put a file path on your computer"))
label1.addMouseListener(specialListener);
label1.setTransferHandler(dropHandler);
label2.setName("label "+i+"-"+j);
label2.setSize(50,50);
label2.setBorder(BorderFactory.createLineBorder(java.awt.Color.black));
label2.addMouseListener(specialListener);
label2.setTransferHandler(dropHandler);
}
}
public static void main(String args[]) {
/*
* Create and display the form
*/
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
javax.swing.JFrame principalFrame = new PrincipalFrame();
//Size of the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
principalFrame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width,
Toolkit.getDefaultToolkit().getScreenSize().height-40);
//Center the window
principalFrame.setLocation(0,0);
principalFrame.setVisible(true);
}
});
}
私は、これは私の知識に何かを追加します、これを答えるために誰かを待っていることが、あなたが投稿していたコードの種類は私に良いSSCCEを表示されていません。良い[SSCCE](http://sscce.org/)を投稿してください。 –
@GagandeepBali「良いSSCCE、悪いSSCCE&SSCCEはありません」です。そのコードは最後のカテゴリに適合します。 OPに。 SSCCEを作成するには、1)JREからの画像を2)ホットリンクしたり、3)実行時に生成するなど、さまざまな処理を行う必要があります。 –
今、その権利。申し訳ありません。 – MHDaouas