使用箭头键绘制线条,并在重新绘制中添加每条新行



我正在用课本自学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;
        }
    }
}

Shape(如PolygonGeneralPath)中累积积分,如图所示。您可以在paintComponent()的实现中draw()当前形状。作为KeyListener的替代方案,请使用密钥绑定,如下所示。

相关内容

  • 没有找到相关文章

最新更新