2016-01-23 103 views
1

我们正试图将变量file传递给另一个类。我们有这些行了一个问题:无法声明类字段

file = (File) item; 

     listModel.addElement(file); 

在我们声明,我们认为在整个类可用于现场file类的开始..然而,当我们得到的线路中提到,我们得到错误file cannot be resolved to a variable 如果我们使file为该类的局部变量,但是我们无法将变量file传递到另一个类上。

下面是代码:

import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class FileDragDemo extends JPanel { 
    public static File file; 
    public static List data; 
    public JList list = new JList(); 


    public FileDragDemo() { 
     list.setDragEnabled(true); 
     list.setTransferHandler(new FileListTransferHandler(list)); 

     add(new JScrollPane(list)); 

    } 

    public static void createAndShowGui() { 
     FileDragDemo mainPanel = new FileDragDemo(); 

     JFrame frame = new JFrame("FileDragDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception { 

     //String filestring =""; 
     //data = new List; 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
       PdfEasyManager PdfEasyManagerObject = new PdfEasyManager(); 
       try { 
        PdfEasyManagerObject.main(args); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
class FileListTransferHandler extends TransferHandler { 
    public JList list; 

    public FileListTransferHandler(JList list) { 
     this.list = list; 
    } 

    public int getSourceActions(JComponent c) { 
     return COPY_OR_MOVE; 
    } 

    public boolean canImport(TransferSupport ts) { 
     return ts.isDataFlavorSupported(DataFlavor.javaFileListFlavor); 
    } 

    public boolean importData(TransferSupport ts) { 
     try { 
      @SuppressWarnings("rawtypes") 

      List data = (List) ts.getTransferable().getTransferData(
        DataFlavor.javaFileListFlavor); 
      if (data.size() < 1) { 
       return false; 
      }// close if 

      DefaultListModel listModel = new DefaultListModel(); 

      for (Object item : data) { 

       file = (File) item; 

       listModel.addElement(file); 

      } // close for 
      //String filestring = file.toString(); 

      list.setModel(listModel); 
      return true; 

     }// close try 
     catch (UnsupportedFlavorException e) { 
      return false; 
     } catch (IOException e) { 
      return false; 
     } 
    } 
} 

回答

4

的静电场fileFileDragDemo类被声明。但是,您使用它的行在另一个名为的类中。如果你想在这个类的方法中访问它,你必须限定声明类的字段访问权限:FileDragDemo.file

但是,在你发布的代码中,我认为使用这个静态变量看起来不太优雅,我会在这里使用一个局部变量。静态变量通常可以并应该避免。

+2

事实上,它不只是在优雅的,它很可能为静态数据是创建内存泄漏由于它们链接到类而不是未使用的对象实例,因此不会收集适当的垃圾。 – Orden

+0

由于保持局部变量更好,您如何将它传递到另一个类以便可以使用? – Moe

+0

要了解如何:你能解释你想在程序中声明静态变量的作用吗?也就是说,它的目的是什么? – Pachelbel

1

您只能使用声明的类中的字段file。您有两个类:FileDragDemo声明字段file,但类尝试使用它。这确实应该给你所描述的错误。

要解决此问题,您可以在类FileDragDemo中声明类。要做到这一点,只需关闭外部类声明的}内部类声明之后,就像这样:

public class FileDragDemo { 
    // ... 

    class FileListTransferHandler { 
     // ... 
    } 
}