2016-10-19 4 views
0

申し訳ありませんが、この質問はおそらく以前に尋ねられましたが、解決策を適用するために私の問題に十分に具体的に適用されるコンテキストで回答を見つけることができませんでした。静的クラスからのJavaリファレンス

とにかく、私はファイルを使用するプログラムに取り組んでいます。そのファイルが更新されたら、File変数を現在のものに置き換えます。私はファイルで動作するメインクラスを設定し、ファイルの更新をリッスンする別のスレッドで別のクラスを設定します。ファイルが更新されると、メインクラスの変数を更新します。

つまり、更新リスナークラスにはメインクラスのインスタンスが必要ですが、更新リスナークラスの開始時に送信しようとすると、メインクラスを静的コンテキストから参照できないという警告が表示されます。

は、ここでは、コードです:

メインクラス

package me.xeyler; 

import com.sun.media.jfxmedia.logging.Logger; 

import javax.swing.*; 
import java.awt.Color; 
import java.io.File; 
import java.io.IOException; 
import java.nio.file.*; 

import static java.nio.file.StandardWatchEventKinds.*; 

/** 
* Created by Brigham on 10/19/2016. 
*/ 
public class ViewerMain { 

    static FileHandler fileHandler; 
    static File skinFile; 

    public static void main(String[] args) { 

     boolean bool = false; 

     fileHandler = new FileHandler(this); 
     fileHandler.start(); 
     while(true) { 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println(bool); 
     } 

    } 

    public void setSkinFile(File skinFile) { 
     this.skinFile = skinFile; 
    } 
} 

ファイルリスナクラス

package me.xeyler; 

import com.sun.media.jfxmedia.logging.Logger; 

import javax.swing.*; 
import java.awt.*; 
import java.io.File; 
import java.io.IOException; 
import java.nio.file.*; 

import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 
import static java.nio.file.StandardWatchEventKinds.OVERFLOW; 

/** 
* Created by Brigham on 10/19/2016. 
*/ 
public class FileHandler implements Runnable { 

    private Thread fileThread; 
    private String threadName; 
    WatchService watcher = null; 
    private ViewerMain main; 

    public FileHandler(ViewerMain main) { 

     this.main = main; 
     this.threadName = "FileThread"; 

    } 

    public void watchFile(Path path) { 

    } 

    public void watchFile(File file) { 

     watchFile(Paths.get(file.getPath())); 

    } 

    public void close() { 
     try { 
      watcher.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void start() { 
     if (fileThread == null) { 
      System.out.println("Starting new thread..."); 
      fileThread = new Thread (this, threadName); 
      fileThread.start(); 
      System.out.println("Started thread: " + threadName); 
     } 
    } 

    @Override 
    public void run() { 

     System.out.println("Running thread..."); 

     Path dir = Paths.get(System.getProperty("user.home"),"documents"); 
     try { 
      watcher = FileSystems.getDefault().newWatchService(); 
      WatchKey key = dir.register(watcher, 
        ENTRY_MODIFY); 
     } catch (IOException x) { 
      x.printStackTrace(); 
     } 

     for (;;) { 

      // wait for key to be signaled 
      WatchKey key; 
      try { 
       key = watcher.take(); 
      } catch (InterruptedException x) { 
       return; 
      } 

      for (WatchEvent<?> event: key.pollEvents()) { 
       WatchEvent.Kind<?> kind = event.kind(); 

       // The filename is the 
       // context of the event. 
       WatchEvent<Path> ev = (WatchEvent<Path>)event; 
       Path filename = ev.context(); 

       if (filename.endsWith("text.txt")) { 
        System.out.println("File has changed"); 
        //TODO: Update File variable in ViewerMain 
        main.setSkinFile(filename.toFile()); 
       } 

      } 

      // Reset the key -- this step is critical if you want to 
      // receive further watch events. If the key is no longer valid, 
      // the directory is inaccessible so exit the loop. 
      boolean valid = key.reset(); 
      if (!valid) { 
       // TODO: Handle inaccessible directory 
       break; 
      } 
     } 

    } 
} 

私は答えは本当に明白である疑いがあるが、忍耐に感謝!

答えて

2

私が正しく理解している場合は、ViewerMainクラスのインスタンスが必要です。

は、静的コンテキストでは適用できません。

public void setSkinFile(File skinFile) { 
    this.skinFile = skinFile; 
} 

skinFileが静的であるため、あなたがpublic static File skinFile;ように、そのプロパティを設定し、あなたがaccesed場合、それはより良いでしょう:あなたはこれを行うことはできませんskinFile

public File skinFile; // Remove static 

public void setSkinFile(File skinFile) { 
    this.skinFile = skinFile; 
} 
0

のための同じ

public static void main(String[] args) { 

    ViewerMain viewer = new ViewerMain(); // an instance 
    fileHandler = new FileHandler(viewer); 

FileHandlerから直接取得したプロパティ:

ViewerMain.skinFile = filename.toFile() 

静的プロパティであるため、アクセスするためにクラスのインスタンスを必要としないので、クラスを直接使用できます。

関連する問題