教科書を使って Java プログラミングを独学しています。演習では、次のことを求められます。
矢印キーを使って線分を描画するプログラムを作成します。図16.22に示すように、線はフレームの中心から始まり、右矢印キー、上矢印キー、左矢印キー、または下矢印キーが押されると、東、北、西、または南に向かって描画されます。 c.
図 16.22c は、ユーザーが押した矢印キーの方向に 1 本の連続線が流れるフレームを示しています。矢印キーを押すたびに、押した矢印キーの方向に線が伸びます。
a の線を 1 回繰り返して描画するところまできましたが、矢印キーを押すと、元の線が消えて新しい線が描画されます。なぜこれを行うのか知っています。そして、私はそれを修正する方法を知っていると思います。糸くずの各反復を(対応するポイントとともに)配列に追加することを考えていました。これまでのところ、書き直しが必要になるため、まだ行っていません。
配列なしでタスクを実行するのに役立つグラフィックスについての学習で見逃したものがあるかもしれないと考えました。もっと簡単な方法があれば、誰かが説明してくれませんか。
これが私がこれまでに持っているコードです:
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;
}
}
}