0

ペン ツールを使用して Java アプレットを実装してみます。アプレットを起動すると、マウスを押して放すことで、ウィンドウに線を正しく描画できます。数秒後、すべてが消えます。これを修正するためのヒントはありますか?

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;


public class MarkPen extends Applet implements ActionListener, AdjustmentListener,     MouseListener, MouseMotionListener {

 private int x = 0;
 private int y = 0;
 private int prevx  = 0;
 private int prevy  = 0;

 private boolean dragging = true;
 private Panel drawPanel = new Panel();

 public void init()
 {
    setLayout(new BorderLayout());

    drawPanel.setBackground(Color.white);
    add(drawPanel, "Center");
    drawPanel.addMouseMotionListener(this);
    drawPanel.addMouseListener(this);

 }


 public void setGraphicalDefaults(MouseEvent e)
 {
    x = e.getX();
    y = e.getY();
    prevx = e.getX();
    prevy = e.getY();
 }

 public void mouseDragged(MouseEvent e)
 {
     Graphics g  = drawPanel.getGraphics();
        g.setColor(Color.black);

        /*
          IF i'm not dragging...
        */
        if (dragging)
        {
           setGraphicalDefaults(e);
           dragging = false;
           g.drawLine(prevx,prevy,x,y);
        }

        /*
          If mouse moved..
        */
        if (x != e.getX() || y != e.getY())
        {
           x = e.getX();
           y = e.getY();

           g.drawLine(prevx,prevy,x,y);

           prevx = x;
           prevy = y;
        }
 }

 public void mouseReleased(MouseEvent e)
 {  
     dragging = true;
 }
 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}
 public void mouseMoved(MouseEvent e){}
 public void mousePressed(MouseEvent e){}
 public void mouseClicked(MouseEvent e){}
 public void adjustmentValueChanged(AdjustmentEvent arg0){}
 public void actionPerformed(ActionEvent e){}

}

新しいバージョン: 私は自分のコードを修正しました。以下に動作中のバージョンがあります

   import java.applet.Applet;
   import java.awt.BorderLayout;
   import java.awt.Color;
   import java.awt.Graphics;
   import java.awt.Graphics2D;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import java.awt.event.AdjustmentEvent;
   import java.awt.event.AdjustmentListener;
   import java.awt.event.MouseEvent;
   import java.awt.event.MouseListener;
   import java.awt.event.MouseMotionListener;
   import java.awt.image.BufferedImage;

   import javax.swing.JComponent;
   import javax.swing.JPanel;



   public class MarkPen extends Applet implements ActionListener, AdjustmentListener, MouseListener, MouseMotionListener {

     private int x = 0;
     private int y = 0;
     private int prevx  = 0;
     private int prevy  = 0;

     private JPanel drawPanel = new JPanel();

     public void init()
     {
        setLayout(new BorderLayout());

        drawPanel.setBackground(Color.white);
        add(drawPanel, "Center");
        drawPanel.addMouseMotionListener(this);
        drawPanel.addMouseListener(this);
        drawPanel.add(new Comp());
        drawPanel.setDoubleBuffered(true);

     }

    public void setGraphicalDefaults(MouseEvent e)
     {
        x = e.getX();
        y = e.getY();
        prevx = e.getX();
        prevy = e.getY();
     }

    public class Comp extends JComponent{
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g  = drawPanel.getGraphics();
            g.setColor(Color.black);

            g.drawLine(prevx,prevy,x,y);
            prevx = x;
            prevy = y;
            g.dispose();
            repaint();
        }
     }  


     public void mouseDragged(MouseEvent e)
     {
         if (x != e.getX() || y != e.getY())
         {
             x = e.getX();
                         y = e.getY(); 
             }    
        }

        public void mousePressed(MouseEvent e){
             setGraphicalDefaults(e);
        }

        public void mouseReleased(MouseEvent e){}
         public void mouseEntered(MouseEvent e){}
         public void mouseExited(MouseEvent e){}
         public void mouseMoved(MouseEvent e){}
         public void mouseClicked(MouseEvent e){}
         public void adjustmentValueChanged(AdjustmentEvent arg0){}
         public void actionPerformed(ActionEvent e){}    

    }
4

1 に答える 1

1

getGraphics()不安定なGraphicsオブジェクトを生成するコンポーネントを呼び出しているため、グラフィックが消えていることは理にかなっています。そうしないでください。代わりに、paint(...)オーバーライドを描画します。さらに良いのは、Swing GUIを使用して、JPanelのpaintComponent(...)メソッドで描画するか、メソッドに表示されるBufferedImageで描画することですpaintComponent(...)

于 2013-03-21T16:47:15.567 に答える