- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序,每次单击空格键时都会发射子弹。但该程序有两个问题:它不会调用 PaintComponent() 或监听我的 KeyBindings。这是我的代码:
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class Shoot extends JPanel {
static JFrame frame;
static Ship s1;
static Shoot shoot;
public Shoot() {
addKeyBinding(KeyEvent.VK_LEFT, "left.pressed", new MoveAction(true, s1, Direction.LEFT), true);
addKeyBinding(KeyEvent.VK_LEFT, "left.released", new MoveAction(false, s1, Direction.LEFT), false);
addKeyBinding(KeyEvent.VK_RIGHT, "right.pressed", new MoveAction(true, s1, Direction.RIGHT), true);
addKeyBinding(KeyEvent.VK_RIGHT, "right.released", new MoveAction(false, s1, Direction.RIGHT), false);
addKeyBinding(KeyEvent.VK_SPACE, "space.pressed", new MoveAction(true, s1, Direction.SPACE), true);
addKeyBinding(KeyEvent.VK_SPACE, "space.released", new MoveAction(false, s1, Direction.SPACE), false);
setDoubleBuffered(true);
}
@Override
public void paintComponent(Graphics g) {
// Draw the ship
super.paintComponent(g);
s1.draw(g);
}
protected void addKeyBinding(int keyCode, String name, Action action, boolean keyPressed) {
if (keyPressed) {
addKeyBinding(KeyStroke.getKeyStroke(keyCode, 0, false), name, action);
} else {
addKeyBinding(KeyStroke.getKeyStroke(keyCode, 0, true), name, action);
}
}
protected void addKeyBinding(KeyStroke keyStroke, String name, Action action) {
InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = getActionMap();
inputMap.put(keyStroke, name);
actionMap.put(name, action);
}
public static void main(String[] args) {
// Set the frame up
frame = new JFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
// Get some more necessary objects
s1 = new Ship();
shoot = new Shoot();
// Threads
Thread ship = new Thread(s1);
ship.start();
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
public class Ship implements Runnable {
int x, y, xDirection, bx, by;
boolean readyToFire, shooting = false;
Rectangle bullet;
public Ship() {
x = 175;
y = 275;
bullet = new Rectangle(0, 0, 3, 5);
}
public void draw(Graphics g) {
g.setColor(Color.BLUE);
g.fillRect(x, y, 40, 10);
g.fillRect(x + 18, y - 7, 4, 7);
if (shooting) {
g.setColor(Color.RED);
g.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);
}
}
public void move() {
x += xDirection;
if (x <= 0)
x = 0;
if (x >= 360)
x = 360;
}
public void shoot() {
if (shooting) {
bullet.y--;
}
}
public void setXDirection(int xdir) {
xDirection = xdir;
}
@Override
public void run() {
try {
while (true) {
shoot();
move();
Thread.sleep(5);
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.util.HashSet;
import javax.swing.AbstractAction;
public class MoveAction extends AbstractAction {
boolean pressed;
Ship s1;
Direction dir;
private HashSet<Direction> movement;
public MoveAction(boolean pressed, Ship s1, Direction dir) {
this.pressed = pressed;
this.s1 = s1;
this.dir = dir;
}
@Override
public void actionPerformed(ActionEvent e) {
if (movement.contains(Direction.LEFT)) {
if (pressed) {
s1.setXDirection(-1);
} else {
s1.setXDirection(0);
}
} else if (movement.contains(Direction.RIGHT)) {
if (pressed) {
s1.setXDirection(1);
} else {
s1.setXDirection(0);
}
} else if (movement.contains(Direction.SPACE)) {
if (pressed) {
if (s1.bullet == null)
s1.readyToFire = true;
if (s1.readyToFire) {
s1.bullet.x = s1.x + 18;
s1.bullet.y = s1.y - 7;
s1.shooting = true;
}
} else {
s1.readyToFire = false;
if (s1.bullet.y <= -7) {
s1.bullet = null;
s1.shooting = false;
s1.bullet = null;
s1.bullet = new Rectangle(0, 0, 0, 0);
s1.readyToFire = true;
}
}
}
}
}
最佳答案
让我们看看你的主要方法:
public static void main(String[] args) {
// Set the frame up
frame = new JFrame();
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
// Get some more necessary objects
s1 = new Ship();
shoot = new Shoot();
// Threads
Thread ship = new Thread(s1);
ship.start();
}
您创建了一个新的 Shoot 对象 - 但是您将它放在哪里?不在任何显示的 JFrame 中。为了使键绑定(bind)和paintComponent 都能够工作,绑定(bind)和绘图组件必须是显示的GUI 的一部分——因此将其添加到您的GUI 中。
例如,考虑:
public static void main(String[] args) {
// Set the frame up
frame = new JFrame();
frame.setSize(400, 300); // ** you really don't want to do this
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
// Get some more necessary objects
s1 = new Ship();
shoot = new Shoot();
frame.add(shoot); // ** added to GUI
frame.setVisible(true); // ** display GUI **after** addition
另外,根据 camickr 的评论 - 每当绘图组件的状态发生变化而改变其绘图时,不要忘记调用 repaint()
。
关于java - 程序不监听 KeyBindings 或 PaintComponent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34910250/
我是 Java 的新手。下面是两个类,一个类扩展JComponent,需要重写paintComponent方法。另一个类扩展了JPanel,同样需要重写paintComponent方法。 为什么Dra
我想知道 paintcomponent() 和 paintcomponents() 有什么不同? 当我从 paintcomponent 使用它时,它显示了我们想要的一切,但是 paintcompone
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Gr
我稍后在我的主方法中使用这样的调用: public static void main(String[] args) { SwingUtilities.invokeLater(new Runna
所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个空间上绘制一个对象。我发现绘制对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。 详
这个问题已经有答案了: paintComponent is not being called in JPanel (1 个回答) 已关闭 4 年前。 很抱歉,这个问题可能已经解决了,但我已经到处搜索但
我的问题非常简单:我有这个小程序,它只是没有显示我正在尝试制作的红框: 主要 public class Main { public static void main(String[] args
我正在尝试编写一个类似这样的应用程序: - 显示对话框 - 当用户单击“确定”时,关闭对话框,转到主应用程序 以下是相关代码片段: public class Owari extends JPanel
这应该是一个抽象类,可以扩展以绘制连接 JPanel 上某些坐标点的线。 但是,永远不会调用专门的 PaintComponents() 方法。我已经看到其他答案并尝试使用他们的解决方案,例如检查我是否
我有以下结构: method1 method2 ... methodn methodX 方法x包含: JFrame frame = new JFrame("Sample"); frame.setDef
我在使用矩形时遇到一些问题 这是我的代码: import java.awt.*; import javax.swing.*; import java.util.*; public class squa
我正在尝试制作西洋跳棋游戏,但以下架构没有在 JFrame 上显示我做错了什么 //基类 import java.awt.event.MouseEvent; import java.awt.event
问题涉及我项目中的 2 个类:主类和绘图类。主类创建 JFrame 并在其中放置 2 个 JPanel。第一个 JPanel 包含用于输入数字的 JTextFields 和用于选择不同选项的 JBut
我已经处理学校作业有一段时间了。但我无法真正理解我应该做什么。作业明天就要交了,我感觉压力很大。 任务是,我将获取一些图片,将它们放在窗口中,然后能够在它们周围移动并能够旋转。 最大的问题是我不知道如
我在使用 PaintComponent 绘制形状时遇到不清楚的问题。 public class Shape extends JPanel { private String shape; private
据我了解,Swing 将决定何时需要重新绘制,这可以解释为什么 paintComponent() 执行两次。但我制作了一个 hibernate 16 毫秒、重绘、 hibernate 16 毫秒、重绘
这是我的代码,它工作完美,并在 JFrame 中绘制形状。每个方法都通过其名称进行调用,在我的程序中我没有调用任何 paintComponent() 方法。那么paintComponent()方法的调
我正在尝试在 JPanel 上绘制一些内容,但似乎我遇到了 paint 和 paintComponent 方法的问题。可能与双缓冲有关,但我不确定。 public void PaintComponen
我是 Swing 新手,正在尝试将图像背景添加到我的 JFrame 中。但是我的 paintComponent 方法不起作用。您能否就如何修复我的代码以便在背景中绘制图像提供一些建议? 代码如下: /
我正在尝试编写简单的程序,当鼠标拖动时绘制圆圈,但paintComponent方法仅被调用一次(启动后)。 在这个类中,我有一些在拖动鼠标时绘制圆圈的方法。 import javax.swing.*;
我是一名优秀的程序员,十分优秀!