2016-10-19 5 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.

this не может быть применен в статическом контексте.

public static void main(String[] args) { 

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

То же самое для skinFile

public File skinFile; // Remove static 

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

Вы не можете сделать это:

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

так skinFile статична, было бы лучше, если вы установите это свойство в качестве public static File skinFile;, а затем вы accesed имущество непосредственно от FileHandler:

ViewerMain.skinFile = filename.toFile() 

Учитывая, что это статическое свойство, вам не нужен экземпляр класса для доступа к нему, вы можете использовать этот класс напрямую.

Смежные вопросы