首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >松开鼠标时,画图程序中的线条消失

松开鼠标时,画图程序中的线条消失
EN

Stack Overflow用户
提问于 2013-03-29 11:56:57
回答 1查看 539关注 0票数 1

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

我的代码看起来像这样:

代码语言:javascript
复制
    // 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);
            }
        }

    }

}

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-29 12:00:13

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

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

请注意,您发布的80%的代码与您的问题无关,完全没有必要,而且会让人分心。

编辑:请注意,您的程序可能受益于使用BufferedImage,绘制到它,然后在JPanel的paintComponent方法中显示BufferedImage。如果你这样做了,那么可以通过getGraphics()获取BufferedImage的Graphics对象,只要你处理完了就把它处理掉。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15697091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档