我有一个JPanel,它打算充当游戏的HUD,自然,我已经重写了paint方法来进行自己的自定义显示,但确实会调用此方法,但是仅在调整大小或最大化,最小化框架时才调用,我的游戏循环告诉它repaint()。由于另外两个面板完全重新粉刷,对我来说,这尤其奇怪。
这是我的HUD课:
package base;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
public class HUD extends JPanel {
private Shiphud[] shiphuds;
public HUD(Ship[] ships) {
shiphuds = new Shiphud[ships.length];
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
for (int i = 0; i < shiphuds.length; i++) {
shiphuds[i] = new Shiphud(ships[i]);
this.add(shiphuds[i]);
}
}
@Override
public void paint(Graphics g) {
for (int i = 0; i < shiphuds.length; i++) {
shiphuds[i].repaint();
}
}
public void run() {
repaint();
}
private class Shiphud extends JPanel {
private Ship ship;
public Shiphud(Ship ship) {
this.ship = ship;
}
@Override
public void paint(Graphics g) {
if (ship != null) {
g.setColor(Color.BLACK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
int fullbar = (int) (this.getWidth() * 0.8);
g.setColor(Color.GREEN);
g.fillRoundRect(getWidth() / 10, getHeight() / 10,
(int) ((ship.energy / 1000) * fullbar), getHeight() / 6, 10, 10);
g.setColor(Color.blue);
g.fillRoundRect(getWidth() / 10, (int) (getHeight() * 0.4),
(int) ((ship.fuel / 1000) * fullbar), getHeight() / 6, 10, 10);
g.setColor(Color.YELLOW);
g.fillRoundRect(getWidth() / 10, (int) (getHeight() * 0.6),
(int) ((ship.ammo / 1000) * fullbar), getHeight() / 6, 10, 10);
g.setColor(Color.MAGENTA);
g.fillRoundRect(getWidth() / 10, (int) (getHeight() * 0.8),
(int) ((ship.special / 1000) * fullbar), getHeight() / 6, 10, 10);
System.out.println("here" + System.currentTimeMillis());
}
}
}
}
它在我的游戏类更新以及其他两个面板中被调用
public void update() {
...
display.run();
display2.run();
hud.run();
}
由我的JFrame调用
public void runFrame() {
Thread thread = new Thread() {
@Override
public void run() {
gameLoop();
}
};
thread.start();
}
public void gameLoop() {
while (true) {
long beginTime = System.nanoTime();
game.update();
long timeTaken = System.nanoTime() - beginTime;
long timeLeft = (UPDATE_PERIOD - timeTaken) / 1000000; // in milliseconds
if (timeLeft < 10) {
timeLeft = 10; // set a minimum
}
try {
// Provides the necessary delay and also yields control so that other thread can do work.
Thread.sleep(timeLeft);
} catch (InterruptedException ex) {
}
}
}
很长一段时间以来一直在试图解决这个问题,但我不明白,任何帮助都会得到高度赞赏
JPanel是轻量级的容器。
为了让孩子画画,您需要在重写的paint()方法中调用super.paint(g)。
问题内容: 因此,这是该书的引文: 覆盖方法不得抛出比被覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException,Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。 现在这是我的问题,如果超类中的方法引发异常,那么重写方法可以根本不引发异常吗? 因为我只是在Ja
我正在为我的申请写测试。我已经为我的gradle项目安装了jacoco插件。在做了测试覆盖率报告后,我看到红色的“公共类MyClass”,这意味着它没有被覆盖。 那么,我如何修复这个问题,并将其覆盖(用绿色着色)?
这是一个更大的项目,所以我将简化结构,不包括这里涉及的所有代码,但我想知道这在概念上是否可行,以及我可能遇到的潜在障碍。 我从主类中得到了几个级别的子类,其中一个级别包含方法age()(从顶部超类重写),该方法调用useEnergy()。此类的直接子类重写age()。该类的直接子类需要重写useEnergy(),但被重写方法中的代码永远不会执行(通过System.out.printlns验证)。有
问题内容: 这个想法有些含糊不清,我需要澄清。 我的问题是使用此代码时: 输出为。 这是因为main函数与method在同一类中,还是由于重写? 我已经在书中读过这个想法,当我将该函数放在另一个类中时,会出现编译器错误。 问题答案: 您不能覆盖方法。如果投射到,则看不到。您 可以 覆盖一个方法,但这不是您要在此处执行的操作(是的,在这里,如果将移至,则会得到另一个方法。我建议您在打算覆盖时注解,
问题内容: 在Java中重写私有方法是无效的,因为父类的私有方法是“自动最终的,并且对派生类是隐藏的”。我的问题主要是学术上的。 不允许父级的私有方法被“重写”(即,在子类中以相同的签名独立实现),这是否违反封装规范?根据封装的原理,子类不能访问或继承父级的私有方法。它是隐藏的。 那么,为什么应该限制子类实现自己的具有相同名称/签名的方法呢?这是否有一个良好的理论基础,还是仅仅是某种务实的解决方案