1

以下の BasicLinePix クラスで記述されているのは、シフト キーを押しながらマウス ボタンを押したまま端点にドラッグすることで、ユーザーが線を描画できるようにするプログラムを作成することです。問題は、マウスを放すと線が消えることです。パネルに表示する線を取得しようとしているだけでなく、同じ方法で描かれた複数の線を表示しようとしています。

私のコードは次のようになります:

    // 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);
            }
        }

    }

}

どんな助けでも大歓迎です!

4

1 に答える 1

6

getGraphics()コンポーネントの Graphics を取得するためにコンポーネントの呼び出しを使用しないでください。メソッドで描画しpaintComponent(...)ます。このアドバイスは、このサイトやグラフィックスのチュートリアルで何度も見られます。

問題は、コンポーネントの呼び出しから取得された Graphics オブジェクトgetGraphics()が永続的な Graphics オブジェクトではなく、次の再描画で消えてしまうことです。

投稿したコードの 80% は問題とは無関係であり、完全に不必要で気を散らすものであることに注意してください。

編集: BufferedImage を使用して描画し、JPanel の paintComponent メソッドで BufferedImage を表示すると、プログラムが恩恵を受けるように見えることに注意してください。このルートに進む場合は、はい、BufferedImage のGraphics オブジェクトgetGraphics()は、使い終わったときに破棄する限り、取得しても問題ありません。

編集 2: 無関係なコードを削除することは良い考えですが、コードをコンパイルできず、実行できなくなるほど削除しないでください。代わりにsscceを作成することを検討してください。

于 2013-03-29T04:00:12.843 に答える