2017-12-19 27 views
0

그래서 나는 스윙을 배우고 그림 프로그램을 만들려고 노력해 왔습니다.자바 스윙. 그림 그리기 프로그램. 충진 간격?

필자가 가진 된 문제는 (당신이 undetstand 해달라고하면 실행 코드) 당신이 생각이 격차를 채우기 나던 빨리

임 마우스를 이동하는 경우는이 ArrayList의를 채우는 곳이 될 수 있다는 것입니다.

이렇게 나는 고칠 수있는 방법을 woundering, 고마워!

내 코드 :

import javax.swing.*; 
import java.util.ArrayList; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseAdapter; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
public class Window extends JPanel implements MouseListener{ 

    //new array list 
    private ArrayList<Point> dots; 


static JFrame frame; 
Font f; 
static int Dx1=0, Dx2=0, Dy1=0, Dy2=0; //fill void dots 


static int v=0; 
static int posX = 250; 
static int posY = 250; 
static double winX=0; 
static double winY=0; 

public Window() { 
    dots = new ArrayList<Point>(); 

    frame = new JFrame(); 
    f = new Font("Calibri", Font.BOLD, 30); 

    this.setBackground(Color.white); 

    frame.add(this); 
    frame.setResizable(true); 
    frame.setVisible(true); 
    frame.setSize(500, 500); 
    frame.setTitle("Minigameshuehu"); 

    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
     // MOVE BALL DEPENDING ON "Dragging" 
    this.addMouseListener(this); 

    this.addMouseListener(new MouseAdapter() { 

    }); 
    this.addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseDragged(MouseEvent e) { 

      dots.add(new Point(e.getX(), e.getY())); // adding pos to to array to make dots 
      repaint(); 
     } 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      posX = e.getX() - 3; 
      posY = e.getY() - 3; 
      repaint(); 
     } 
    } 
    ); 
    //End of moving ball 


} 

public void paint(Graphics g) { 
    super.paint(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setColor(new Color(0,0,0)); 
    g2.fillOval(posX, posY, 6, 6); 
} 


@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setColor(Color.black); 
    for (Point point : dots) { 
     g2.fillOval(point.x-3, point.y-3, 6, 6); 
    } 
} 


    public static void main(String[] args) throws InterruptedException { 

     Window applikation = new Window(); 

    } 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
//  posX=(e.getX()-25); 
//  posY=(e.getY()-25); 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     v=0; 
     // TODO Auto-generated method stub 

    } 

} 
+0

맞습니다. 모든 픽셀에 대해 MouseEvent가 생성되지 않습니다. 따라서 타원을 그릴 수는 없으므로 실제로 ArrayList의 두 점 사이에 선을 그려야합니다. – camickr

+0

'paintComponent' 만 오버라이드해야합니다. paint 메소드를 오버라이드 (override)하지 말아주세요. https://docs.oracle.com/javase/tutorial/uiswing/painting/을 참조하십시오. – VGR

답변

2

할 수 있도록, 그것은 간격

올바른

,로, MouseEvent가 모든 픽셀에 대해 생성되지 채우기 나던 빨리 마우스를 이동하는 경우 생성 된 모든 포인트에 대해 타원을 그립니다.

대신 ArrayList의 두 점 사이에 선을 그려야합니다. 이 타원형의 말처럼 보이는, 그래서 이것은 둥근 가장자리 선을 그릴 것입니다

g2.setStroke(new BasicStroke(15, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 

:

for (int i = 0; i < dots.size() - 1; i++) 
{ 
    Point p1 = dots.get(i); 
    Point p2 = dots.get(i + 1); 
    g2.drawLine(...); 
} 

는 또한 같은 것을 사용하여 그린 라인의 크기를 변경하는 것이 좋습니다.