引用'这个'来自未扩展JavaPlugin的类

时间:2015-07-07 00:35:04

标签: java minecraft bukkit

我正在尝试使用此方法创建一个启动Scheduler任务的插件:

public void newCountdown() {
    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
        public void run() {
            for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                player.sendMessage("Hey");
            }
        }                   
}, 0, 20);
}

问题是,当我尝试调用该方法时,它说它需要是一个静态方法。然后,当我将它改为静态时,第一个参数"这个"说它不能在静态环境中使用。

当方法不是静态时,scheduleSyncRepeatingTask会显示此错误:

  

BukkitScheduler类型中的方法scheduleSyncRepeatingTask(Plugin,Runnable,long,long)不适用于参数(activateDevMode,new Runnable(){},int,int)

当我尝试它给我的任何快速修复时,它总会导致另一个错误。

有没有办法从Main类引用this而不必让我的方法保持静态?

1 个答案:

答案 0 :(得分:1)

这不起作用的原因是因为staticthis永远不会在一起。考虑它的一个简单方法是static删除Java的面向对象部分。 this是一个指向您班级当前实例的关键字,不能与static一起使用,因为使用static变量就像完全删除所有实例一样。

您必须将this更改为Main班级的实例(extends JavaPlugin)。您可以初始化静态变量onEnable()以存储实例

public static Main that; //"Main" will be replaced with the name of your Main class

@Override
public void onEnable(){
    //set that to an instance of your Main class (this)
    that = this;
}

@Override
public void onDisable(){
    //set that to null to prevent memory leaks
    that = null;
}

现在,您可以通过将newCountdown()替换为that

来使this方法保持静态
public static void newCountdown() {
    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Main.that, new Runnable() {
        public void run() {
            for(Player player : Bukkit.getServer().getOnlinePlayers()){
                player.sendMessage("Hey");
            }
        }                   
    }, 0, 20);
}