- 벡터로 자료를 영구 보관시키고있슴
- 마우스를 드래그한 범위를 선을 그림
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class LineDrawEx extends JFrame { public LineDrawEx(){ setContentPane(new MyPanel()); setSize(300,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } class MyPanel extends JPanel{ Point startP = null; Point endP = null; public MyPanel(){ this.addMouseListener(new MyMouseListener()); } class MyMouseListener extends MouseAdapter{ public void mousePressed(MouseEvent e){ startP = e.getPoint(); // 클릭한부분을 시작점으로 } public void mouseReleased(MouseEvent e){ endP = e.getPoint(); // 드래그 한부분을 종료점으로 Graphics g = getGraphics(); g.drawLine(startP.x, startP.y, endP.x, endP.y); } } } public static void main(String[] args) { new LineDrawEx(); } }
이렇게 하게되면 드래그를 통해서 선은 그려지나..... 영구 보존되진않는다. 화면에 변화생기면 지워진다.
벡터를 이용해서 영구적 자료 보관하면서 그리기import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class LineDrawEx extends JFrame { public LineDrawEx(){ setContentPane(new MyPanel()); setSize(300,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } class MyPanel extends JPanel{ Vector<Point> sv = new Vector<Point>(); // 시작 Vector<Point> se = new Vector<Point>(); // 끝점 public MyPanel(){ this.addMouseListener(new MyMouseListener()); // 리스너 } public void paintComponent(Graphics g){ super.paintComponent(g); // 부모 페인트호출 if(sv.size() == 0) // 벡터에 암것도없으면 리턴 return; for(int i=0;i<sv.size();i++){ //벡터크기만큼 Point sp = sv.get(i); // 벡터값을꺼내다 Point ep = se.get(i); g.drawLine(sp.x, sp.y, ep.x, ep.y);//그리다 } } class MyMouseListener extends MouseAdapter{ public void mousePressed(MouseEvent e){ sv.add(e.getPoint()); // 클릭한부분을 시작점으로 } public void mouseReleased(MouseEvent e){ se.add(e.getPoint()); // 드래그 한부분을 종료점으로 repaint(); // 다시그려라 } } } public static void main(String[] args) { new LineDrawEx(); } }
기존 기능에서 마우스를찍고 드래그하는 위치를 보여주는 예쩨
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Vector; public class LineDrawEx extends JFrame { public LineDrawEx(){ setContentPane(new MyPanel()); setSize(300,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } class MyPanel extends JPanel{ Point startP=null; Point endP=null; Vector<Point> sv = new Vector<Point>(); // 시작 Vector<Point> se = new Vector<Point>(); // 끝점 public MyPanel(){ //리스너를 공통으로해야 변수들이 공유된다. MyMouseListener ml = new MyMouseListener(); this.addMouseListener(ml); // 리스너 this.addMouseMotionListener(ml); } public void paintComponent(Graphics g){ super.paintComponent(g); // 부모 페인트호출 if(sv.size() != 0){ for(int i=0;i<se.size();i++){ //벡터크기만큼 Point sp = sv.get(i); // 벡터값을꺼내다 Point ep = se.get(i); g.drawLine(sp.x, sp.y, ep.x, ep.y);//그리다 } } if(startP != null) g.drawLine(startP.x, startP.y, endP.x, endP.y); } class MyMouseListener extends MouseAdapter implements MouseMotionListener{ public void mousePressed(MouseEvent e){ startP = e.getPoint(); sv.add(e.getPoint()); // 클릭한부분을 시작점으로 } public void mouseReleased(MouseEvent e){ se.add(e.getPoint()); // 드래그 한부분을 종료점으로 endP = e.getPoint(); repaint(); // 다시그려라 } public void mouseDragged(MouseEvent e){ endP = e.getPoint(); repaint(); } public void mouseMoved(MouseEvent e){ } } } public static void main(String[] args) { new LineDrawEx(); } }
'소프트웨어 > Java' 카테고리의 다른 글
[Java] 자바 Graphics - 원 그래프 그리기 (0) | 2012.05.14 |
---|---|
[Java Thread Swing] 카운트 업 레이블 만들기 (0) | 2012.05.14 |
[Java Thread] 자바 스레드 동기화 Synchronized (0) | 2012.05.14 |
[Java Thread] 움직이는 뱀게임 만들기 (0) | 2012.05.14 |
Swing - Tab 탭 만들기 (0) | 2012.05.14 |