一般信息:我正在使用版本git-Spigot-1d14d5f-ba32592(MC:1.8.3)(实现API版本1.8.3-r0.1-snapshot)、IntelliJ IDEA 14.1.3中的Bukkit/spigot API并使用其默认编译器进行编译。java jdk版本为1.8.0_25。
package me.lakan.util.inventory;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") // Util functionality is not always used
public class InventoryMenu implements Listener {
private InventoryType type;
private String title;
private Map<Integer, MenuOption> options;
// Constructors
public InventoryMenu(InventoryType type, String title, JavaPlugin plugin) {
this.options = new HashMap<Integer, MenuOption>();
this.type = type;
this.title = title;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
public boolean addOption(int position, MenuOption option) {
boolean res = isPosEmpty(position);
this.options.put(position, option);
return res;
}
public void addOption(String name, int position, ItemStack icon) {
addOption(position, new MenuOption(icon, name));
}
public boolean isPosEmpty(int position) {
return !this.options.containsKey(position);
}
public void openFor(Player p) {
// Create a new inventory
Inventory inv = Bukkit.createInventory(p, this.type, this.title);
// Fill all icons at their positions
for (Map.Entry<Integer, MenuOption> key : this.options.entrySet()) {
inv.setItem(key.getKey(), key.getValue().getIcon());
}
// If the inventory is a player inventory, update the player's
if (inv.getType() == InventoryType.PLAYER) {
p.getInventory().setContents(inv.getContents());
}
// For any openable inventory, just open it up
else {
p.openInventory(inv);
}
}
/**
* Listens for inventory clicks
* If the inventory is a menu:
* - Cancel movement
* - Push event
* - Close inventory if it should
* @param e The actual event
*/
@EventHandler(priority = EventPriority.HIGHEST)
public void onInventoryClick(InventoryClickEvent e) {
// Prevent clicking if this inventory was clicked
if (e.getClickedInventory().getName().equals(this.title)) {
e.setCancelled(true);
// Check for option
if (this.options.containsKey(e.getRawSlot())) {
// Get the option for this slot
MenuOption option = this.options.get(e.getRawSlot());
// Fill out an event and push it
MenuClickEvent event = new MenuClickEvent((Player) e.getWhoClicked(), true, option.getName(), e.getRawSlot());
Bukkit.getServer().getPluginManager().callEvent(event);
// Now close inventory if not cancelled
if (event.willCLose()) {
e.getWhoClicked().closeInventory();
}
}
}
}
@SuppressWarnings("unused")
public interface OptionClickEventHandler {
public void onOptionClick(MenuClickEvent event);
}
}
package me.lakan.test;
import me.lakan.util.inventory.InventoryMenu;
import me.lakan.util.inventory.MenuClickEvent;
import me.lakan.util.inventory.MenuOption;
import me.lakan.util.item.ItemBuilder;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryType;
public class ItemMenu implements Listener {
private PluginEntry plugin;
private InventoryMenu menu;
// Commands
private TestCommand testCmd;
public ItemMenu(PluginEntry plugin) {
Validate.notNull(this.plugin, "The plugin reference may not be null");
this.plugin = plugin;
this.menu = new InventoryMenu(InventoryType.CHEST, "" + ChatColor.DARK_GRAY + "Abilities", this.plugin);
// Test
this.menu.addOption(1,
new MenuOption(
new ItemBuilder()
.amount(1)
.material(Material.RAW_FISH)
.name(ChatColor.LIGHT_PURPLE + "Test")
.lore(ChatColor.WHITE + "Click me")
.build(),
"TestIdentifier"));
this.testCmd= new TestCmd(this.plugin);
}
public void openFor(Player p) {
this.menu.openFor(p);
}
@EventHandler(priority = EventPriority.NORMAL)
public void onOptionClick(MenuClickEvent e) {
// Test
if (e.getName().equals("TestIdentifier")) {
this.testCmd.executeFor(e.getWhoClicked());
}
}
}
实用工具类在一个单独的模块中,如果我将它们粘贴到测试插件模块中,而不是粘贴到其他模块中,则一切正常。但是,可以正常调用me.lakan.util.Inventory中的任何其他类中的任何其他构造函数。
问题出在项目结构上。
对于测试工件,我选择了util模块的模块输出。将它更改为util模块的工件输出就修复了它。
在我目前的项目中,我觉得有必要在Java中使用反射创建一种模拟回调系统。然而,我在让我的反射真正发挥作用方面遇到了问题。错误代码如下: 当我构造对象时,我使用的语法如下: 当我尝试创建伪回调时,它会点击catch块。我在上面包含了一些跟踪调试,以显示我的一个方法的输出失败。输出: 我想不出问题所在,于是开始打猎,但收效甚微。我能找到的最好的方法就是提到编译后的JAR和运行时之间的版本控制冲突。然而
我在Jenkinsfile中有以下代码,并且已经安装了kubernetes插件。 我得到以下错误 java.lang.NoSuchMethodError:在步骤[approverereceivedevent、approveRequestedEvent、archive、bat、build、catchError、checkout、container、containerLog、createEvent、d
问题内容: 当我运行junit测试时,我可以获得正确的结果,并且数据可以存储到数据库中。 当我将项目部署到tomcat时,出现了此异常。 我的Spring版本是3.1.1,tomcat版本是6.0。 这是行不通的 ): pom.xml: 问题答案: 正确的签名是 but something tries to call 使用spring 3.1或更高版本来构建应用程序和之前的版本3.1在tomcat
问题内容: 春天来了 这是我的存储库,这是导致问题的存储库 我该如何解决? 问题答案: ClassTypeInformation在1.1.0版中引入了该方法: 确保您的spring-data-commons版本> = 1.1.0
我下载并安装了uCanAccess JAR,方法如下:不使用ODBC从Java操作Access数据库,我正在学习如何使用microsoft Access db for Java,这是我使用的代码 当我运行java程序时,它会出现这样的错误 UCANAccess-2.0.9.3.jar commons-lang-2.6.jar commons-logging-1.1.1.jar 所以...我怎么才能
问题内容: 我试图使用读取文件: 我收到以下错误: 我正在使用flink版本1.3.2,java版本“ 1.8.0_91” 问题答案: 错误“ java.lang.NoSuchMethodError”的可能原因之一是当我们使用的flink版本与系统上安装的版本不同时。对我来说,我有Flink 1.3.2,我使用的版本是1.1.1。因此,我将pom文件更新为相同的版本。