Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用箭头键绘制线条并在重绘中添加每一条新线_Java_Swing_Event Handling_Graphics2d - Fatal编程技术网

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

Java 使用箭头键绘制线条并在重绘中添加每一条新线,java,swing,event-handling,graphics2d,Java,Swing,Event Handling,Graphics2d,我正在用教科书自学Java编程。练习要求您: 编写一个使用箭头键绘制线段的程序。当按下向右箭头键、向上箭头键、向左箭头键或向下箭头键时,该线从帧的中心开始向东、北、西或南绘制,如图16.22c所示 图16.22c显示了一个框架,其中一条连续线沿着用户按下的箭头键的方向流动。每次按箭头键时,线都会沿所按箭头键的方向延伸 我已经画了一条线的一次迭代,但当我按下箭头键时,原来的线消失了,画了一条新的线。我知道它为什么会这样。我想我知道如何修复它。我正在考虑将lint的每次迭代添加到一个数组中(及其对应

我正在用教科书自学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
的替代方法,使用键绑定,如图所示