2016-01-23 101 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 { 
     // ... 
    } 
}