Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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_Line_Paint_Repaint - Fatal编程技术网

Java 鼠标释放时,绘制程序中的线条消失

Java 鼠标释放时,绘制程序中的线条消失,java,swing,line,paint,repaint,Java,Swing,Line,Paint,Repaint,下面我在BasicLinePix类中编写了一个程序,该程序允许用户通过按住shift键同时按住鼠标按钮并将其拖动到端点来绘制线条。问题是,当鼠标松开时,线消失了。我尝试在面板中显示线条,以及显示以相同方式绘制的多条线条 我的代码如下所示: // this method overrides the paint method defined in JFrame public void paint(Graphics g) { super.paint(g);

下面我在BasicLinePix类中编写了一个程序,该程序允许用户通过按住shift键同时按住鼠标按钮并将其拖动到端点来绘制线条。问题是,当鼠标松开时,线消失了。我尝试在面板中显示线条,以及显示以相同方式绘制的多条线条

我的代码如下所示:

    // this method overrides the paint method defined in JFrame
    public void paint(Graphics g) {
        super.paint(g);


    }


    // Inner class - instances of this class handle action events
    private class EventHandler implements ActionListener, MouseListener,
            MouseMotionListener {

        private Point startPoint = null; // line's start point
        private Point endPoint = null; // line's most recent end point

        public void actionPerformed(ActionEvent arg0) {
            if (arg0.getActionCommand().equals("Exit")) {
                statusLabel.setText("Exiting program...");
                System.exit(0);
            }

        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent e) {

            if (e.isShiftDown()) {

                // record starting point for line
                startPoint = new Point(e.getX(), e.getY());

                // initialize endPoint
                endPoint = startPoint;
            }

            if (e.isControlDown()) {
                Graphics g = drawingPanel.getGraphics();
                g.drawString("Hello", e.getX(), e.getY());
            }

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            //repaint the frame and its contents
            //this executes the paint method defined above
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {

            if (e.isShiftDown()) {
                // Implement rubber-band cursor
                Graphics g = drawingPanel.getGraphics();
                g.setColor(Color.black);

                g.setXORMode(drawingPanel.getBackground());

                // REDRAW the line that was drawn
                // most recently during this drag
                // XOR mode means that yellow pixels turn black
                // essentially erasing the existing line
                drawLine(g, startPoint, endPoint);

                // Update the end point of the line to current mouse position
                endPoint = new Point(e.getX(), e.getY());

                // Draw line to current mouse position
                // XOR mode: yellow pixels become black
                // black pixels, like those from existing lines, temporarily
                // become
                // yellow
                drawLine(g, startPoint, endPoint);

            }

        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        private void drawLine(Graphics g, Point start, Point end) {
            if (startPoint != null && endPoint != null) {
                int startX = ((Double) start.getX()).intValue();
                int startY = ((Double) start.getY()).intValue();

                int endX = ((Double) end.getX()).intValue();
                int endY = ((Double) end.getY()).intValue();

                g.drawLine(startX, startY, endX, endY);
            }
        }

    }

}

任何帮助都将不胜感激

不要对组件使用
getGraphics()
调用来获取组件的图形。在
paintComponent(…)
方法中绘制。您将在本网站和图形教程中多次找到此建议

问题在于,通过调用组件上的
getGraphics()
获得的图形对象不是持久的图形对象,将在下次重新绘制时消失

请注意,您发布的代码中有80%与您的问题无关,完全没有必要且会分散您的注意力

编辑:请注意,使用BuffereImage并绘制到它,然后在JPanel的paintComponent方法中显示BuffereImage,看起来您的程序可能会从中受益。如果您确实这样做了,那么是的,通过
getGraphics()
获取BuffereImage的图形对象是可以的,只要您处理完它就可以了


编辑2:虽然删除不相关的代码是一个好主意,但不要删除太多以至于使代码无法编译和运行。查看创建。

不要对组件使用
getGraphics()
调用来获取组件的图形。在
paintComponent(…)
方法中绘制。您将在本网站和图形教程中多次找到此建议

问题在于,通过调用组件上的
getGraphics()
获得的图形对象不是持久的图形对象,将在下次重新绘制时消失

请注意,您发布的代码中有80%与您的问题无关,完全没有必要且会分散您的注意力

编辑:请注意,使用BuffereImage并绘制到它,然后在JPanel的paintComponent方法中显示BuffereImage,看起来您的程序可能会从中受益。如果您确实这样做了,那么是的,通过
getGraphics()
获取BuffereImage的图形对象是可以的,只要您处理完它就可以了


编辑2:虽然删除不相关的代码是一个好主意,但不要删除太多以至于使代码无法编译和运行。研究一下,而不是创建一个。

谢谢,我会处理这个问题,看看结果如何。我将编辑我的帖子,使其更具相关性。+1,你会在fourms上找到更多的建议。在过去的10年里,我一直在论坛上闲逛,我们一直在提供这个建议。人们在哪里还发现了这个糟糕的建议?阅读编辑并考虑到这一点,我认为在这一点上,结束这个问题,研究和利用大家给我的信息是我和其他人的最佳利益。非常感谢大家!谢谢,我会处理好的,看看结果如何。我将编辑我的帖子,使其更具相关性。+1,你会在fourms上找到更多的建议。在过去的10年里,我一直在论坛上闲逛,我们一直在提供这个建议。人们在哪里还发现了这个糟糕的建议?阅读编辑并考虑到这一点,我认为在这一点上,结束这个问题,研究和利用大家给我的信息是我和其他人的最佳利益。非常感谢大家!有关拖动鼠标时绘制矩形的示例,请参见。如果您对mouseReleased方法中的repaint()调用进行注释,您将获得一个小的进步。有关拖动鼠标时绘制矩形的示例,请参见。如果您对mouseReleased方法中的repaint()调用进行注释,您将获得一个小的进步