2016-06-02 2 views
1

최근에 저는 Java로 시작했고 이제는 간단한 프로젝트로 인해 어려워졌습니다. 선을 그려보고 싶습니다.하지만 다른 선을 그리면 첫 번째 선이 사라집니다. 드로잉 라인을 유지할 수 있도록하는 방법을 모릅니다.그래픽은 JFrame에서 계속 재설정됩니다.

package com.example.paint; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class ClickEvent extends MouseAdapter { 
    private Paint paint; 

    boolean click = false; 
    boolean clear = false; 

    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int firstTime = 1; 

    public ClickEvent(Paint paint, Handler handler, Line line) { 
     this.paint = paint; 
    } 

    public void mousePressed(MouseEvent e) { 
     int mx = e.getX(); 
     int my = e.getY(); 
     if (mouseOver(mx, my, 750, 560, 83, 40)) { 
      clear = true; 
     } 
     if (mouseOver(mx, my, 0, 0, 40, 40)) { 
      paint.color = "Black"; 
     } 
     if (mouseOver(mx, my, 0, 40, 40, 40)) { 
      paint.color = "Blue"; 
     } 
     if (mouseOver(mx, my, 0, 80, 40, 40)) { 
      paint.color = "Green"; 
     } 
     if (mouseOver(mx, my, 0, 120, 40, 40)) { 
      paint.color = "Red"; 
     } 
     if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) { 
      clear = false; 
      startX = mx; 
      startY = my; 
      click = true; 
     } 
    } 

    public void mouseReleased(MouseEvent e) { 
     int mx = e.getX(); 
     int my = e.getY(); 
     if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) { 
      endX = mx; 
      endY = my; 
      click = false; 
     } 
    } 

    private boolean mouseOver(int mx, int my, int x, int y, int width, int height) { 
     if (mx > x && mx < x + width) { 
      if (my > y && my < y + height) { 
       return true; 
      } else 
       return false; 
     } else 
      return false; 
    } 

    public void tick() { 
    } 

    public void render(Graphics g) { 
     Font font = new Font("Arial", 1, 30); 
     Font font1 = new Font("Arial", 1, 13); 

     g.setColor(Color.black); 
     g.fillRect(0, 0, 40, 40); 

     g.setColor(Color.blue); 
     g.fillRect(0, 40, 40, 40); 

     g.setColor(Color.green); 
     g.fillRect(0, 80, 40, 40); 

     g.setColor(Color.red); 
     g.fillRect(0, 120, 40, 40); 

     g.setColor(Color.black); 
     g.drawRect(750, 560, 83, 40); 
     g.setFont(font); 
     g.drawString("Clear", 755, 590); 

     g.setFont(font1); 
     if (paint.color == "Red") { 
      g.setColor(Color.red); 
      g.drawString("Color: " + paint.color, 745, 15); 
     } else if (paint.color == "Blue") { 
      g.setColor(Color.blue); 
      g.drawString("Color: " + paint.color, 745, 15); 
     } else if (paint.color == "Green") { 
      g.setColor(Color.green); 
      g.drawString("Color: " + paint.color, 745, 15); 
     } else if (paint.color == "Black") { 
      g.setColor(Color.black); 
      g.drawString("Color: " + paint.color, 745, 15); 
     } else { 
      g.setColor(Color.black); 
      g.drawString("Color: ", 745, 15); 
     } 
     if (!clear) { 
      if ("Red".equals(paint.color) && !click) { 
       g.setColor(Color.red); 
       g.drawLine(startX, startY, endX, endY); 
      } else if ("Green".equals(paint.color) && !click) { 
       g.setColor(Color.green); 
       g.drawLine(startX, startY, endX, endY); 
      } else if ("Blue".equals(paint.color) && !click) { 
       g.setColor(Color.blue); 
       g.drawLine(startX, startY, endX, endY); 
      } else if ("Black".equals(paint.color) && !click) { 
       g.setColor(Color.black); 
       g.drawLine(startX, startY, endX, endY); 
      } 
     } 
    } 
} 

코드의 일부는 기본적인 튜토리얼의 일부입니다,하지만 난 노력 나머지는 자신을 할 : 이 내 코드입니다. 누군가가 드로잉 선을 유지하는 방법을 알 수 있거나 다른 개선 사항이 있다면 정말 고맙겠습니다.

답변

0

startX, startY, endX, endY 형태로 나중에 그릴 때 한 줄만 저장하는 것이 문제입니다.

각 클릭이 끝나면 줄을 새 줄 객체로 저장할 수 있습니다. 이런 식으로 뭔가 :

List<MyLine> lineList = new ArrayList<>(); 

을 그리고는 mouseReleased 방법, 목록에 새 줄을 추가합니다 :

class MyLine { 
    private final int startX, startY; 
    private final int endX, endY; 
    private final Color color; 

    public MyLine(int startX, int startY, int endX, int endY, Color color) { 
     this.startX = startX; 
     this.startY = startY; 
     this.endX = endX; 
     this.endY = endY; 
     this.color = color; 
    } 

    public void draw(Graphics g) { 
     g.setColor(color); 
     g.drawLine(startX, startY, endX, endY); 
    } 
} 

이 클래스에 필드로 목록을 추가

if (!mouseOver(mx, my, 0, 0, 40, 160) && !mouseOver(mx, my, 750, 560, 83, 40)) { 
    endX = mx; 
    endY = my; 
    click = false; 
    lineList.add(new MyLine(startX, starY, endX, endY, paint.color)); 
} 

Paint을 변경하여 색이 Color 개체로 유지되도록해야합니다.

class Paint { 
    public Color color; 
    ... 
} 
~~~~ 
paint.color = Color.black; 

문자열을 저장하는 것보다 훨씬 쉽습니다.

마지막으로, 라인의 모든 돌이는 render 방법에서, 그들을 그리는 :

for(MyLine l : lineList) { 
    l.draw(g); 
} 
+0

난 정말 당신이 그렇게 quikly 명확하게 응답 한 감사합니다. 정말 고맙습니다. –

관련 문제