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

标签 java swing event-handling graphics2d

我正在用教科书自学 Java 编程。练习要求您:

编写一个程序,使用箭头键绘制线段。当按下右箭头键、上箭头键、左箭头键或下箭头键时,该线从框架的中心开始向东、北、西、南绘制,如图16.22所示c.

图 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;
        }
    }
}

最佳答案

形状中累积您的点,例如多边形GeneralPath,参见here 。您可以在 paintComponent() 的实现中 draw() 当前形状。作为 KeyListener 的替代方案,请使用键绑定(bind),如 here 所示。 .

关于java - 使用箭头键绘制线条并在重绘中添加每条新线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18559456/

相关文章:

java - 为什么我的 JList 更新后就消失了?

java - 在 JVM 中为字符串处理应用程序设置新生代和终身代的比例

java - 在 JList 项目之间添加空格

基于java的音乐播放器仅识别.wav文件格式

asp.net - 如何在asp.net代码后面的html标签中添加事件处理程序?

java - 如何获取日志文件中的 hibernate 日志

java - 无法导入 android.support.design.widget.NavigationView

java - 在java swing中添加多张图片的if语句

javascript - 函数式响应式编程相对于事件监听器的优势

C++ 存储变量和继承