jlabel의 아이콘에서 이미지를 드래그하여 두 번째 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