Java多个拖放面板不起作用

Java多个拖放面板不起作用,java,swing,drag-and-drop,Java,Swing,Drag And Drop,我在Jpanel上有多个DnD面板,具有boarder布局。每个DnD面板都有一个文本字段设置为放置目标。只有最后一个DnD面板获得焦点。其他人则不作为投放目标。这是DnD面板的代码 public class DnDPanel extends javax.swing.JPanel { /** Creates new form DnDPanel */ public DnDPanel() { initComponents(); dndTextField.setDro

我在Jpanel上有多个DnD面板,具有boarder布局。每个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
}
公共类DnDPanel扩展了javax.swing.JPanel{
/**创建新表单DnDPanel*/
公共DnDPanel(){
初始化组件();
dndTextField.setDropTarget(新的DropTarget(){
@凌驾
公共同步作废删除(DropTargetDropEvent evt){
试一试{
dndTextField.setBackground(颜色:白色);
evt.acceptDrop(DnDConstants.ACTION\u副本);
List droppedFiles=(List)evt.getTransferable().getTransferData(
DataFlavor.javaFileListFlavor);
用于(文件:droppedFiles){
dndTextField.setText(file.getAbsolutePath());
}
dndTextField.setBackground(颜色.getHSBColor(0.56f,1.0f,0.9f));
}捕获(例外情况除外){
例如printStackTrace();
}
}
@凌驾
公共同步无效dragEnter(DropTargetDragEvent dtde){
//更改光标。。。
光标=新光标(光标.指针\光标);
设置游标(游标);
dndTextField.setText(“放在这里!!”;
dndTextField.setBackground(颜色.getHSBColor(0.56f,1.0f,0.9f));
}
@凌驾
公共同步void dragExit(DropTargetEvent dtde){
游标=新游标(游标。默认\u游标);
设置游标(游标);
dndTextField.setBackground(颜色:白色);
setText(“拖放文件夹”);
}
});
}
公共静态void setText(字符串文本)
{
dndTextField.setText(文本);
}
公共静态字符串getPath()
{
返回dndTextField.getText();
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
// 
私有组件(){
dndTextField=newjavax.swing.JTextField();
setPreferredSize(新java.awt.Dimension(250250));
setHorizontalAlignment(javax.swing.JTextField.CENTER);
dndTextField.setText(“DnD”);
dndTextField.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
dndTextFieldActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout=new org.jdesktop.layout.GroupLayout(此);
这个.setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(dndTextField,org.jdesktop.layout.GroupLayout.DEFAULT\u SIZE,244,Short.MAX\u值)
.addContainerGap())
);
layout.setVerticalGroup(
createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(dndTextField,org.jdesktop.layout.GroupLayout.DEFAULT\u SIZE,244,Short.MAX\u值)
.addContainerGap())
);
}// 
私有void dndTextFieldActionPerformed(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:
}                                            
//变量声明-不修改
私有静态javax.swing.JTextField dndTextField;
//变量结束声明
}

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

private static javax.swing.JTextField dndTextField;

解决办法很简单:不要这样做!如果您希望每个JPanel都有自己的JTextField,它的行为独立于其他JPanel,那么它们应该是非静态的。事实上,除非有非常明确的指示,否则您应该尽量减少在程序中使用静态内容。

谢谢!我重用了我为一个只有一个DnD面板的不同应用程序编写的代码片段。完全忘记了我将文本字段定义为静态变量。@lochi:很高兴这有帮助。我很幸运,我发现了这个,但很容易就错过了。如果将来有类似的问题,请考虑创建和发布,这样我们就可以更容易地分析、修改和改进代码。祝你好运!