下面是来自“Simon”的代码,我在其中运行显示应该显示的正确段,但我的 keyPress 有问题,当我使用它时使用箭头键它不会亮起。不是一个很好的编码员,我真的需要一些帮助。
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Arc2D;
import javax.swing.Timer;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Simon extends JFrame implements KeyListener {
// public DrawStuff game;
public static Simon simon;
Graphics2D g2;
Graphics2D g3;
Graphics2D g4;
Graphics2D g5;
public JFrame frame = new JFrame();
public JPanel panel = new JPanel();
private ActionListener timerAction;
public Simon() {
frame = new JFrame();
panel = new JPanel();
// Sets up JFrame
frame.setTitle("Simon Says");
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawStuff game = new DrawStuff();
panel.setLayout(new BorderLayout());
panel.add(game, BorderLayout.CENTER);
frame.add(panel);
frame.addKeyListener(this);
// game.setFocusable(true);
// game.requestFocus();
frame.setVisible(true);
}
public class DrawStuff extends JPanel {
public void paint(Graphics g) {
g2 = (Graphics2D) g;
g3 = (Graphics2D) g;
g4 = (Graphics2D) g;
g5 = (Graphics2D) g;
// assume d == 145 && e == 90
g2.setPaint(Color.BLUE.darker());
g2.fill(new Arc2D.Double(45, 45, 400, 400, 145, 90, Arc2D.PIE));
g3.setPaint(Color.RED.darker());
g3.fill(new Arc2D.Double(45, 45, 400, 400, 235, 90, Arc2D.PIE));
g4.setPaint(Color.GREEN.darker());
g4.fill(new Arc2D.Double(45, 45, 400, 400, 325, 90, Arc2D.PIE));
g5.setPaint(Color.YELLOW.darker());
g5.fill(new Arc2D.Double(45, 45, 400, 400, 55, 90, Arc2D.PIE));
}
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
g5.setPaint(Color.YELLOW);
//Color YELLOW = Color.WHITE;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
g2.setPaint(Color.BLUE.darker());
//Color BLUE = Color.WHITE;
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
g3.setPaint(Color.RED.darker());
//Color RED = Color.WHITE;
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
g4.setPaint(Color.GREEN.darker());
//Color GREEN = Color.WHITE;
}
panel.repaint();
}
public void keyReleased(KeyEvent e) {
/**
* if (e.getKeyCode() == KeyEvent.VK_UP) { Color YELLOW = Color.YELLOW;
* repaint(); }
*
* if (e.getKeyCode() == KeyEvent.VK_LEFT) { Color BLUE = Color.BLUE;
* repaint(); }
*
* if (e.getKeyCode() == KeyEvent.VK_DOWN) { Color RED = Color.RED;
* repaint(); }
*
* if (e.getKeyCode() == KeyEvent.VK_RIGHT) { Color GREEN = Color.GREEN;
* repaint(); }
**/
}
@Override
public void keyTyped(KeyEvent e) {
}
// TODO Auto-generated method sub
public static void main(String[] args) {
simon = new Simon();
}
}
最佳答案
你在这里做了一些猜测,这是行不通的。相反,我建议您:
- 首先,也是最重要的,使用键绑定(bind),而不是 KeyListener,因为键绑定(bind)允许您在不使用杂乱无章的情况下解决 KeyListener 焦点问题。您可以在此处找到键绑定(bind)教程:Key Binding Tutorial .
- 接下来,永远不要尝试从绘画方法中提取 Graphics 对象并在绘画方法之外使用它,除非在绘画方法直接调用的方法中。您提取并尝试在 MouseListener 中使用的 Graphics 对象不是长期存在的对象,当您尝试使用它们时甚至可能为 null。
- 相反,在 MouseListener 中更改类变量的状态,然后在绘制方法中使用这些变量的状态来告诉它要绘制什么。看Performing Custom Painting Tutorial有关如何使用 Swing 绘图的更多信息。
- 确保当按下正确的键时,您将那个饼图画得更暗,并且所有其他饼图正常。
其他问题:
- 您的类扩展了 JFrame,但您创建了另一个 JFrame。不要这样做,拥有并使用一个 JFrame 或另一个,但不要同时拥有,因为那样只会让您以后感到困惑。
- 您的绘图 JPanel 应该覆盖其
paintComponent
方法而不是其paint
方法。 - 您需要在您的重写中调用 super 的绘画方法。因此,如果您像我建议的那样重写 paintComponent,请在重写的第一行调用
super.paintComponent(g);
,因为这将允许 JPanel 进行内务绘画,包括删除旧的脏图像。
有关我正在谈论的内容的示例,请参阅 this answer of mine to a similar question .这将创建这个 GUI:
关于java - 如何使 keyPress 与 keyListener 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027235/