2017-09-03 2 views
1
나는 그것이 포함 (P)에 의해 사각형의 배열 목록을 통해 이동하면서 커서를 변경 method.The 문제가

자바 스윙 : 사각형

  1. 내 첫 알고리즘이 필요

    을 이상 누르고 있으면 마우스 커서가 무례한 행동 iterator를 사용하여 사각형을 반복하는 것은 예상대로 작동하지 않습니다. 커서는 첫 번째 사각형 위로 마우스를 가져갈 때만 바뀌고 다른 사각형에서는 커서가 바뀌고 커서가 커서가 움직이고 있음을 콘솔을 통해 나타내지도 않습니다 그 (것)들의 위? !!

  2. 내 두 번째 솔루션도 제대로 작동하지 않습니다. for 루프를 사용하여 직사각형을 반복합니다. 사각형을 통해 콘솔 위로 마우스를 가져 가면 커서가 마지막 사각형을 제외하고 바뀌지 않습니다. .
  3. 이 SSCCE에서 JPanel을 사용합니다. JTextPane을 사용하여 문제가 발생하기 때문입니다. 코딩 방법이 문제가 있다고 가정합니다.

나는 응답과 성능을 향상시키기 위해 스레드를 필요로할지 모르지만 접근 방법에 대해서는 확신 할 수 없다고 생각합니다. 사전에 감사드립니다.

public class UnstableCursor extends JPanel{ 

    Rectangle2D rec; 
    ArrayList<Rectangle2D> recList = new ArrayList<>(); 

    public UnstableCursor(){ 

    } 

    public static void main(String[] args) { 
     UnstableCursor uc = new UnstableCursor(); 
     JFrame frame = new JFrame(); 

     Mover mv = new Mover(uc); 
     uc.addMouseListener(mv); 
     uc.addMouseMotionListener(mv); 
     JScrollPane jx = new JScrollPane(uc); 

     frame.getContentPane().add(jx); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500,500); 
     frame.setVisible(true); 
    } 


    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponents(g); 

     Graphics2D g2d = (Graphics2D)g; 
     int x = 5; 
     for(int i = 0;i < 4;i++){ 
      g2d.setColor(Color.red); 
      rec = new Rectangle2D.Double(20,x,100,5); 
      g2d.draw(rec); 

      recList.add(rec); 

      x += 50; 
     } 
     System.out.println("RecList is: " +recList.size()); 
    } 

} 

class Mover extends MouseInputAdapter{ 
    UnstableCursor uc; 
    Rectangle2D rec; 
    ArrayList<Rectangle2D> reList; 

    public Mover(UnstableCursor ucc){ 
     uc = ucc; 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     super.mouseDragged(e); 
     Point p = e.getPoint(); 
     System.out.println("xxxx"); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     Point p = e.getPoint(); 
     reList = uc.recList; 
     //System.out.println("List is: "+reList.size()); 
     Iterator <Rectangle2D> recs = reList.iterator(); 

     //--------------------- First Algorithm ----------------------// 
     if(recs.hasNext()){ 
      rec = recs.next(); 
      if(rec.contains(p)){ 
       System.out.println("inside the rectangle...."); 
       uc.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
      }    
      else{ 
      uc.setCursor(Cursor.getDefaultCursor()); 
      } 

     } 


     //--------------------- Second Algorithm ---------------------// 
     int r = 0; 
     for(int i = 0;i<(reList.size());i++){ 
      rec = reList.get(r); 
      //System.out.println("Rect No: "+r+"X: "+rec.getX()+"Y: "+rec.getY()); 
      r++; 
      if(rec.contains(p)){ 
       System.out.println("inside the rectangle....");      
       uc.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
      } 
      else{ 
      uc.setCursor(Cursor.getDefaultCursor()); 
      } 
     } 

    } 

} 

답변

1

커서가 마지막 사각형을 제외하고 변경을 거부합니다.

기본 검색 알고리즘이 잘못되었습니다. 포인트가 포함 된 사각형을 찾으면 커서를 설정하고 루프에서 빠져 나오십시오. 그렇지 않으면 체크 한 다음 사각형은 일치하지 않으며 커서는 다시 재설정됩니다.

for(int i = 0;i < 4;i++){ 
    g2d.setColor(Color.red); 
    rec = new Rectangle2D.Double(20,x,100,5); 
    g2d.draw(rec); 

    recList.add(rec); 

    x += 50; 
} 

또한

는 ... ... 그림 방법은 그림입니다.

스윙이 패널을 다시 칠해야한다고 판단 할 때 paintComponent() 메서드가 계속 호출되므로 사각형을 만들어 배열에 추가하면 안됩니다.

각 사각형을 한 번만 추가 할 수 있도록 클래스의 생성자에서 사각형에 List를 추가해야합니다.

+0

@camikr 당신은 내 stackoverflow 가장 큰 영웅 중 하나입니다 !!!!-) 나는 아직도 초보자입니다. 많은 예제를 사용합니다. 대답을 감사드립니다. 나는 실제로 회 돌이 응답을 사용하여 'break'키워드. 추가 설명이 필요한 부분은 직사각형을 만들어서 페인팅 메서드의 배열에 추가해서는 안된다는 것입니다. 그래서 당신이 조언을 사각형 생성 및 목록 생성자 이동하지만 어떻게 그릴 것인가? 내 그래픽 객체는 생성자에서 생성되는 사각형의 수를 어떻게 인식합니까? – Afroid1000

+0

@ Afroid1000,'그래픽 객체가 생성자에서 생성되는 사각형의 수를 어떻게 인식하나요? '- 나는 그 질문을 이해하지 못합니다. 검색 알고리즘에서 LIst를 반복하는 방법을 알고 있습니다. 그럼 페인팅 코드에서 똑같이하십시오. 목록의 모든 항목을 반복하고 각 사각형을 칠합니다. – camickr

+0

나는 지금 너를 가졌어. 나는 List 인스턴스를 페인트 메서드로 지나치게하고 그 내용을 그리기 위해 반복한다. 감사합니다. – Afroid1000