Java 使用箭头键绘制线条并在重绘中添加每一条新线
我正在用教科书自学Java编程。练习要求您: 编写一个使用箭头键绘制线段的程序。当按下向右箭头键、向上箭头键、向左箭头键或向下箭头键时,该线从帧的中心开始向东、北、西或南绘制,如图16.22c所示 图16.22c显示了一个框架,其中一条连续线沿着用户按下的箭头键的方向流动。每次按箭头键时,线都会沿所按箭头键的方向延伸 我已经画了一条线的一次迭代,但当我按下箭头键时,原来的线消失了,画了一条新的线。我知道它为什么会这样。我想我知道如何修复它。我正在考虑将lint的每次迭代添加到一个数组中(及其对应的点)。我还没有完成,因为到目前为止需要重写 我想在学习图形的过程中可能会遗漏一些东西,这些东西可以帮助我在没有阵列的情况下完成任务。如果有更简单的方法,有人能给我解释一下吗 以下是我目前掌握的代码:Java 使用箭头键绘制线条并在重绘中添加每一条新线,java,swing,event-handling,graphics2d,Java,Swing,Event Handling,Graphics2d,我正在用教科书自学Java编程。练习要求您: 编写一个使用箭头键绘制线段的程序。当按下向右箭头键、向上箭头键、向左箭头键或向下箭头键时,该线从帧的中心开始向东、北、西或南绘制,如图16.22c所示 图16.22c显示了一个框架,其中一条连续线沿着用户按下的箭头键的方向流动。每次按箭头键时,线都会沿所按箭头键的方向延伸 我已经画了一条线的一次迭代,但当我按下箭头键时,原来的线消失了,画了一条新的线。我知道它为什么会这样。我想我知道如何修复它。我正在考虑将lint的每次迭代添加到一个数组中(及其对应
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class DrawLinesWithArrowKeys extends JFrame {
DrawLinesPanel panel = new DrawLinesPanel();
/** Constructor */
public DrawLinesWithArrowKeys() {
add(panel);
panel.setFocusable(true);
}
/** Main Method */
public static void main(String[] args) {
JFrame frame = new DrawLinesWithArrowKeys();
frame.setTitle("Draw Lines With Arrow Keys");
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
/** Inner class Draw Lines Panel */
private class DrawLinesPanel extends JPanel {
private int x1Offset = 0;
private int x2Offset = 0;
private int y1Offset = 0;
private int y2Offset = 0;
/* Constructor */
public DrawLinesPanel () {
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
y1Offset = y2Offset;
x1Offset = x2Offset;
y2Offset -= 10;
repaint();
}
else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
y1Offset = y2Offset;
x1Offset = x2Offset;
y2Offset += 10;
repaint();
}
else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x1Offset = x2Offset;
y1Offset = y2Offset;
x2Offset -= 10;
repaint();
}
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x1Offset = x2Offset;
y1Offset = y2Offset;
x2Offset += 10;
repaint();
}
}
});
}
/* Paint line */
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(computeXOne(), computeYOne(), computeXTwo(), computeYTwo());
}
private int computeXOne() {
return (getWidth() / 2) + x1Offset;
}
private int computeXTwo() {
return (getWidth() / 2) + x2Offset;
}
private int computeYOne() {
return (getHeight() / 2) + y1Offset;
}
private int computeYTwo() {
return (getHeight() / 2) + y2Offset;
}
}
}
在
形状
中累积点,如多边形
或通用路径
,如图所示。您可以在paintComponent()
的实现中draw()
当前形状。作为KeyListener
的替代方法,使用键绑定,如图所示