- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在一个项目中工作,我必须创建一个 CUI 游戏,现在将其转换为 GUI,我正在向与游戏交互的按钮添加功能,但遇到了麻烦。
这是我尝试访问的方法。它属于一个名为 Pet 的类。
public double feedPet() {
if(this.hunger < MAX_HUNGER) {
this.hunger += food;
if(this.hunger > MAX_HUNGER) {
this.hunger = MAX_HUNGER;
}
System.out.println(this.petName + " enjoyed the meal!");
System.out.println("Hunger increased by " + food + " to a total of " + this.hunger);
spacing();
}
else {
System.out.println(this.petName + " is currently full!");
spacing();
}
return this.hunger;
}
这是尝试访问该方法的类。
public GamePanel(PetWorld petWorld, Pet pet, Game game) {
initComponents();
genComponents(pet);
}
private void genComponents(final Pet pet) {
this.setSize(600, 600);
graphicsPanel.setSize(600, 400);
graphicsPanel.setBackground(Color.red);
buttonPanel.setSize(600, 200);
buttonPanel.setBorder(BorderFactory.createTitledBorder("Pet Options"));
JButton feedBtn = new JButton("Feed");
JButton playBtn = new JButton("Play");
JButton sickBtn = new JButton("Medicine");
JButton trainBtn = new JButton("Train");
JButton sleepBtn = new JButton("Sleep");
//// error occurring here I believe \\\\
feedBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pet.feedPet();
}
});
buttonPanel.setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
//// Pet Options \\\\
gc.weightx = 0.5;
gc.weighty = 0.5;
gc.gridx = 0;
gc.gridy = 1;
buttonPanel.add(feedBtn, gc);
gc.gridx = 1;
gc.gridy = 1;
buttonPanel.add(playBtn, gc);
gc.gridx = 2;
gc.gridy = 1;
buttonPanel.add(sickBtn, gc);
gc.gridx = 3;
gc.gridy = 1;
buttonPanel.add(trainBtn, gc);
gc.gridx = 4;
gc.gridy = 1;
buttonPanel.add(sleepBtn, gc);
}
我必须把宠物做成最终的,我相信这很糟糕,因为我改变了宠物本身的值(value)观,例如幸福,饥饿等
按下按钮时出现的错误
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at pdcmainGUI.GamePanel$1.actionPerformed(GamePanel.java:63)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
有更好的方法来实现我想要做的事情吗?我猜这是由于尝试更改变量值但在 gui 类中设置为 Final 的方法引起的?任何建议表示赞赏。
最佳答案
问题与您对 Action 监听器的声明有关。当您在 genComponents(final Pet pet) 过程中创建 ActionListener() 时,这不是它在运行时执行的位置。
但首先,我们还需要明确将变量调用为 final。这意味着 pet
无法重新分配给不同的 pet,但这并不意味着您无法访问 pet
的方法可能会改变,例如 isHungry()、setFed(boolean) 等。
第二,让你的宠物
进入范围。当您定义genComponents(final Pet pet)
过程时,pet
在作用域内,因此java编译器在编译时不会出现问题。但在运行时,genComponents(final Pet pet)
过程会在 pet
已知的情况下执行,并在此执行期间创建 ActionListener
,指向参数的变量位置。 genComponents(...) 过程完成后,参数超出范围。当按下按钮触发 ActionListener
时,它会尝试引用超出范围的变量的内存位置。
private void genComponents(final Pet pet) {
....
feedBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pet.feedPet(); <-- pet refers to the parameter, but it is out of scope when this gets executed.
}
});
....
}
解决方案空间:要解决此问题,需要从范围内的某个位置访问 pet
,您只需将 pet
存储为私有(private)类变量即可做到这一点.
public class GamePanel {
private final Pet pet;
public GamePanel(PetWorld petWorld, Pet pet, Game game) {
this.pet = pet;
initComponents();
genComponents(); <-- remove the pet parameter
}
private void genComponents() {
....
feedBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pet.feedPet(); <-- this pet now refers to the class variable, which is still in scope.
}
});
....
}
}
关于Java Swing Action 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416180/
当包裹在 EmberJS Controller 的 actions 中时,如何从另一个 Action 调用一个 Action ? 使用现已弃用的方式定义操作的原始代码: //app.js App.In
我有一个 Action (一个yaml文件),用于将docker镜像部署到Google Cloud Run。 我希望收到通知构建和推送结果的Slack或电子邮件。 构建操作完成后,如何触发消息操作?
Selenium 的 actions 类中存在的 tick(Action action) 和 tick(Interaction...actions) 方法的用途是什么? 是否与点击任何 webElem
简短的背景故事 我们目前为数百名用户提供对话操作。我们在过去三年中为我们的一位客户开发了这个 Action 作为“工作”。正如我们最近发现的那样,我们会受到对话行为的影响。 当然,我们现在正在研究如何
考虑系统用户可以并发方式执行两个操作,第一个操作 (A1) 仅对用户的订单执行,第二个操作 (A2) 包括在执行时执行 (A1),如下面的使用所述-案例图..((考虑A1完全执行U1,A2完全执行U2
我正在为 android 中的 ActionBar 而苦苦挣扎。 这是我的问题:我的操作项没有显示在操作栏中,而是堆叠在操作溢出中,无论我做什么.. 我花了一天的时间寻找解决方案,但我似乎找不到缺少的
我正在构建一个工作流,其中一个操作为工作流中的一个步骤提供条件。我该如何使用这个值? 该操作的值为空,因此计算结果为 false,并且从未部署过任何内容... jobs: build: s
鉴于您有一些全局 View (例如,显示加载屏幕),您可能希望在许多情况下发生这种情况,为该行为创建一个 Action 创建者/ Action 对还是为相关 Action 创建 reducer 更合适
我有一个使用 DialogFlow 构建的 Actions on Google 代理,其中包含多个操作(例如 actions.intent.MAIN 和 get_day_of_week)。 当我在 3
是否可以从我的 action.yml 文件中引用另一个 GitHub 操作? 请注意,我在这里谈论的是操作,而不是工作流程。我知道这可以通过工作流来完成,但是操作可以引用其他操作吗? 最佳答案 答案似
在 Vuex 操作中,我们有以下实现。 async actionA({ commit, dispatch }) { const data = this.$axios.$get(`/apiUrl`)
我正在将我的应用程序服务器从 Jboss 4.2 迁移到 7.1。我在 Struts 配置中收到以下错误。 struts.xml 中定义的 Action 被调用,而 Action 包中的操作未被调用。
我向 ActLand 发送请求,然后 intercept(),如果没有登录则重定向到 Login.jsp。 struts.xml:
我有一个 Action 创建器,它接受一个 id 和一个回调函数。它向服务器发送请求以执行某些操作并返回一个虚拟操作。我在这里想做的就是调用回调函数并退出,因为该虚拟操作对我来说没有用处,例如喜欢帖子
我已经使用 Html.Action 方法调用了另一个 View 。当用户单击操作链接时,我想在 subview 内使用参数调用相同的操作。 当我写这段代码时,我得到了这个错误信息: Html.Acti
是 public event Action delt = () => { Console.WriteLine("Information"); }; 的重载版本 Action delg = (a, b)
countresultsfrom.addActionListener(new ActionListener() { public void actionPerforme
我刚刚看到一个 brand-new video在 Rx 框架上,一个特别的签名引起了我的注意: Scheduler.schedule(this IScheduler, Action) 在 23:55,
我创建了一个在我的开发者帐户中完美运行的 DialogFlow 应用程序。 但我需要以另一个用户的身份对其进行测试,因此在我的 Google Action 模拟器中,我添加了另一个测试帐户作为项目的所
我正在尝试实现消息存储拦截器以在我的 JSp 上显示 ActionMessage,但无法访问 ActionMessage。有人可以提供一个链接如何实现消息存储拦截器吗? 最佳答案 这是我的一个应用程序
我是一名优秀的程序员,十分优秀!