【问题标题】:Java Multiple Drag and Drop Panels does not workJava 多个拖放面板不起作用
【发布时间】:2012-11-28 15:13:57
【问题描述】:

我在具有边界布局的 Jpanel 上分层放置了多个 DnD 面板。每个 DnD 面板都有一个文本字段设置为放置目标。只有最后一个 DnD 面板获得焦点。其他人不充当丢弃目标。这是 DnD 面板的代码

public class DnDPanel extends javax.swing.JPanel {
/** Creates new form DnDPanel */

public DnDPanel() {
    initComponents();        
    dndTextField.setDropTarget(new DropTarget() {

        @Override
        public synchronized void drop(DropTargetDropEvent evt) {
            try {
                dndTextField.setBackground(Color.WHITE);
                evt.acceptDrop(DnDConstants.ACTION_COPY);
                List<File> droppedFiles = (List<File>) evt.getTransferable().getTransferData(
                        DataFlavor.javaFileListFlavor);
                for (File file : droppedFiles) {
                    dndTextField.setText(file.getAbsolutePath());
                }
                dndTextField.setBackground(Color.getHSBColor(0.56f, 1.0f, 0.9f));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public synchronized void dragEnter(DropTargetDragEvent dtde) {
            //Change cursor...
            Cursor cursor = new Cursor(Cursor.HAND_CURSOR);
            setCursor(cursor);
            dndTextField.setText("Drop Here !!");
            dndTextField.setBackground(Color.getHSBColor(0.56f, 1.0f, 0.9f));
        }

        @Override
        public synchronized void dragExit(DropTargetEvent dtde) {
            Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
            setCursor(cursor);
            dndTextField.setBackground(Color.WHITE);
            dndTextField.setText("Drag n drop a Folder");
        }
    });
}

public static void setText(String text)
{
    dndTextField.setText(text);
}

public static String getPath()
{
    return dndTextField.getText();
}


/** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    dndTextField = new javax.swing.JTextField();

    setPreferredSize(new java.awt.Dimension(250, 250));

    dndTextField.setHorizontalAlignment(javax.swing.JTextField.CENTER);
    dndTextField.setText("DnD");
    dndTextField.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            dndTextFieldActionPerformed(evt);
        }
    });

    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .add(dndTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
        .add(layout.createSequentialGroup()
            .add(dndTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE)
            .addContainerGap())
    );
}// </editor-fold>

private void dndTextFieldActionPerformed(java.awt.event.ActionEvent evt) {                                             
    // TODO add your handling code here:
}                                            

// Variables declaration - do not modify
private static javax.swing.JTextField dndTextField;
// End of variables declaration
}

【问题讨论】:

    标签: java swing drag-and-drop


    【解决方案1】:

    一个主要问题是您为 JTextField 使用静态变量:

    private static javax.swing.JTextField dndTextField;
    

    解决方案很简单:不要这样做!如果您希望每个 JPanel 都拥有自己的 JTextField,而 JTextField 的行为独立于另一个,那么它们应该是非静态的。事实上,您应该尽量减少在程序中使用静态的任何东西,除非有一个非常强烈的要求这样做。

    【讨论】:

    • 谢谢!我重用了我为一个不同的应用程序编写的代码 sn-p,只有一个 DnD 面板。完全忘记了我将文本字段定义为静态变量。
    • @lochi:很高兴这有帮助。我很幸运我发现了这一点,但很容易错过它。如果您以后有类似的问题,请考虑创建并发布sscce,这会使我们更容易地分析、修改和改进您的代码。祝你好运!
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多