【问题标题】:How can set warning if JLabel is dragged for the second time which already dragged and dropped (java swing)如果第二次拖动已经拖放的 JLabel,如何设置警告(java swing)
【发布时间】:2017-07-10 17:30:57
【问题描述】:

我是java新手。我想用java swing做一个拖放应用程序。其中,会有一些 JLabel source(label1,label2,label3) 和 destination(labelD1,labelD2,labelD3) 用于拖放。一个标签只能拖放一次,如果第二次拖放一个已经拖放到任何目标标签的标签,应该有一个警告消息。我尝试使用 addMouseMotionListener 但无法解决。如果我有任何建议应该是正确的方法,那将是一个很大的帮助。

我的代码如下:

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.TransferHandler;

public class Editor extends JFrame{
    String selectedLable = "";
    JLabel label1,label2, label3, labelD1, labelD2, labelD3;
    public Editor() {
        super("Drag and Drop Image");
        label1 = new JLabel("label1");
        label2 = new JLabel("label2");
        label3 = new JLabel("label3");
        labelD1 = new JLabel();
        labelD2 = new JLabel();
        labelD3 = new JLabel();

        label1.setBounds(20, 30, 50, 50);
        label2.setBounds(100, 30, 50, 50);
        label3.setBounds(180, 30, 50, 50);
        labelD1.setBounds(20, 200, 50, 20);
        labelD2.setBounds(100, 200, 50, 20);
        labelD3.setBounds(180, 200, 50, 20);

        labelD1.setBorder(BorderFactory.createLineBorder(Color.black));
        labelD2.setBorder(BorderFactory.createLineBorder(Color.black));
        labelD3.setBorder(BorderFactory.createLineBorder(Color.black));

        MouseListener ml = new MouseListener() {
            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {
                JComponent jc = (JComponent)e.getSource();
                TransferHandler th = jc.getTransferHandler();
                th.exportAsDrag(jc, e, TransferHandler.COPY_OR_MOVE);
                //can i get the source label and check, is label already in 
                //global variable,show warning if its dragged and dropped 
                //once??
        }

        @Override
        public void mouseExited(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseClicked(MouseEvent e) {

        }
        };
        /*
        label1.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
            // can i set the sourse label to a global variable and
            // and check it mousePressed??
            }
        });
    */
    label1.addMouseListener(ml);
    label2.addMouseListener(ml);
    label3.addMouseListener(ml);

    label1.setTransferHandler(new TransferHandler("text"));
    label2.setTransferHandler(new TransferHandler("text"));
    label3.setTransferHandler(new TransferHandler("text"));
    labelD1.setTransferHandler(new TransferHandler("text"));
    labelD2.setTransferHandler(new TransferHandler("text"));
    labelD3.setTransferHandler(new TransferHandler("text"));

    add(label1);
    add(label2);
    add(label3);
    add(labelD1);
    add(labelD2);
    add(labelD3);

    setLayout(null);
    setSize(500,500);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

}

public static void main(String[] args) {
    new Editor();
    }

}

【问题讨论】:

    标签: java swing drag-and-drop


    【解决方案1】:

    我尝试使用 addMouseMotionListener

    也许您可以使用ComponentListener?您可以收听componentMoved 事件。然后您可以从标签中删除 DnD 功能。

    我猜你可以这样做:

    JLabel label = (JLabel)event.getSource();
    label.setTransferHandler( null );
    

    【讨论】:

    • 谢谢你们,我通过扩展“TransferHandler”类并在“exportDone()”和“importData()”中添加我的条件解决了这个问题
    【解决方案2】:

    想到的是,您应该实现自己的 JLabel 类(通过扩展原始类)并添加一个布尔成员,以表示它之前是否被拖动过。 然后在您的侦听器方法中,在实际移动标签之前检查标签的布尔成员是真还是假,并相应地显示您的警告消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多