在Java中通过KeyTyped事件绘制两行

嗨我想在键盘上按h和v在面板中绘制水平和垂直轴。 我不知道……这是我的代码。 如何控制Keytyped事件

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import javax.swing.JPanel; import java.awt.geom.Line2D; @SuppressWarnings("serial") public class DrawAxis extends JPanel implements KeyListener { private Graphics2D g2; private float x1; private float y1; private float x2; private float y2; public void DrawingAxis(float X1,float Y1,float X2,float Y2) { x1=X1; y1=Y1; x2=X2; y2=Y2; } public void paint(Graphics g) { super.paintComponent(g); g2=(Graphics2D) g; g2.setColor(Color.GRAY); g2.setStroke(new BasicStroke(1)); g2.draw(new Line2D.Float(x1,y1,x2,y2)); } @Override public void keyPressed(KeyEvent event) { } @Override public void keyReleased(KeyEvent event) { } @Override public void keyTyped(KeyEvent event) { char ch=event.getKeyChar(); switch(ch) { case 'h': //???????? case 'v': //???????? } } } 

这是主要代码:

 import javax.swing.JFrame; public class Example1 { public static void main(String[] args) { JFrame frame=new JFrame("Drawing line"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1000,1000); DrawAxis dshape=new DrawAxis(); dshape.DrawingAxis(500,0,500,1000); dshape.DrawingAxis(0,500,1000,500); dshape.setFocusable(true); dshape.addKeyListener(dshape); frame.add(dshape); frame.setVisible(true); } } 

我该如何完成此代码?

首先使用KeyListener的键绑定API,它将解决与KeyListener相关的一些关键问题。 有关更多详细信息,请参见如何使用键绑定 。

您可以简单地在数组或List存储一系列点,并使用Graphics#drawLine在它们之间绘制线条,或者您可以利用Graphics 2D的形状API。 有关详细信息,请参阅2D图形

EtchaSketch

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.geom.Path2D; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DrawLine { public static void main(String[] args) { new DrawLine(); } public DrawLine() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private Point currentPoint; private Path2D shape; public TestPane() { currentPoint = new Point(0, 0); shape = new Path2D.Double(); shape.moveTo(0, 0); bindKey(KeyEvent.VK_H, "draw.horizontally", new AddPointAction(4, 0)); bindKey(KeyEvent.VK_V, "draw.vertically", new AddPointAction(0, 4)); } protected void bindKey(int vkKey, String name, Action action) { InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); ActionMap am = getActionMap(); im.put(KeyStroke.getKeyStroke(vkKey, 0), name); am.put(name, action); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.draw(shape); g2d.dispose(); } public class AddPointAction extends AbstractAction { private int xDelta; private int yDelta; public AddPointAction(int xDelta, int yDelta) { this.xDelta = xDelta; this.yDelta = yDelta; } @Override public void actionPerformed(ActionEvent e) { int x = currentPoint.x + xDelta; int y = currentPoint.y + yDelta; shape.lineTo(x, y); currentPoint.x = x; currentPoint.y = y; repaint(); } } } }