【问题标题】:How to make keyPress work with keyListener如何使 keyPress 与 keyListener 一起工作
【发布时间】:2016-01-06 18:01:46
【问题描述】:

下面是来自“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();

}
}

【问题讨论】:

  • ........你好?

标签: java swing keypress keylistener


【解决方案1】:

你在这里做了一些猜测,这是行不通的。相反,我建议您:

  • 首先,使用 Key Bindings,而不是 KeyListener,因为 Key Bindings 可以让您绕过 KeyListener 焦点问题,而无需使用 kludge。您可以在此处找到密钥绑定教程: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:

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2023-03-28
    • 1970-01-01
    • 2023-02-02
    • 2021-12-19
    • 2012-05-29
    • 2018-05-17
    • 2014-08-16
    • 2012-05-25
    相关资源
    最近更新 更多