2013-03-21 1 views
0

펜 도구로 Java 애플릿을 구현하려고합니다. 애플릿을 시작할 때 마우스를 눌렀다가 놓으면 창에서 내 선을 올바르게 그릴 수 있습니다. 몇 초 후에 모든 것이 사라집니다. 해결 방법이 있습니까?자바 Awt 펜 도구 : 그래픽이 사라졌습니다

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){} 

} 

NEW VERSION : 내 코드를 수정하고 여기에 아래의 작업 버전

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){}  

    } 

답변

1

그것은 그래픽이 사라지고 있다는 의미가있다 당신은 불안정한를 생성하는 구성 요소에 getGraphics()를 호출하고 있기 때문에 그래픽 객체, 지속되지 않는 객체. 그러지 마. 대신 paint(...) 재정의를 그립니다. 스윙 GUI를 사용하여 JPanel의 paintComponent(...) 메서드를 그리거나 paintComponent(...) 메서드에 표시되는 BufferedImage를 그릴 수 있습니다.

+0

답변 해 주셔서 감사합니다. 제 코드가 수정되었습니다. 나는 작업 버전을 게시합니다. – user2195984

관련 문제