我正在尝试通过keyEvent向左移动一个圆圈。到目前为止,圆已在窗口上绘制,但不会向左移动!我觉得问题是我在容器中添加了Window()构造函数。在控制台上没有输出告诉我它正在工作。因此,我认为它甚至不会到达KeyEvent类。这是我的代码:
import java.awt.*; import java.awt.event.*; import java.awt.geom.Ellipse2D; import javax.swing.*; public class Window extends JPanel { private static Ellipse2D.Double circle; public Window() { super(); int width = 400; int height = 400; circle = new Ellipse2D.Double(0.5 * width, 0.9 * height, 0.1 * width, 0.05 * height); addKeyListener(new MoveCircle()); } @Override protected void paintComponent(Graphics g) { super.paintComponents(g); Graphics2D brush = (Graphics2D) g; int width = getWidth(); int height = getHeight(); g.clearRect(0, 0, width, height); brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); brush.draw(circle); } public class MoveCircle implements KeyListener { @Override public void keyPressed(KeyEvent e) { System.out.println("Working on top!"); if (e.getKeyCode() == KeyEvent.VK_LEFT) { System.out.println("Working on bottom!"); circle.x++; repaint(); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } } public static void main(String[] args) { Window window = new Window(); JFrame frame = new JFrame(); Container container = frame.getContentPane(); container.add(new Window()); frame.addKeyEvent(window.new MoveCircle()); frame.setSize(800, 700); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setVisible(true); } }
实际上,这是您要添加Window到的内容JFrame,但重点是JFrame,因此,当您键入内容Keyboard时,该内容JFrame将KeyListener转到与Window类无关的内容。因此,为了克服它,你只需要调用requestFocusInWindow()的Window类的对象。试试这个代码,我已经对EDT和东西做了一些修改。
Window
JFrame
Keyboard
KeyListener
requestFocusInWindow()
import java.awt.*; import java.awt.event.*; import java.awt.geom.Ellipse2D; import javax.swing.*; public class Window extends JPanel { private static Ellipse2D.Double circle; private JFrame frame; public Window() { super(); int width = 400; int height = 400; circle = new Ellipse2D.Double(0.5 * width, 0.9 * height, 0.1 * width, 0.05 * height); } public Dimension getPreferredSize() { return (new Dimension(frame.getWidth(), frame.getHeight())); } @Override protected void paintComponent(Graphics g) { super.paintComponents(g); Graphics2D brush = (Graphics2D) g; int width = getWidth(); int height = getHeight(); g.clearRect(0, 0, width, height); brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); brush.draw(circle); } public class MoveCircle implements KeyListener { @Override public void keyPressed(KeyEvent e) { System.out.println("Working on top!"); if (e.getKeyCode() == Event.ENTER) { System.out.println("Working on bottom!"); double newX = circle.x - 1; circle.x = newX; repaint(); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } } private void createAndDisplayGUI(Window window) { frame = new JFrame(); Container container = frame.getContentPane(); container.add(window); window.addKeyListener(new MoveCircle()); frame.setSize(800, 700); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setVisible(true); window.requestFocusInWindow(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Window window = new Window(); window.createAndDisplayGUI(window); } }); } }