2012-04-17 1 views
4

JScrollPane (행/열 헤더 포함) 사용 방법에 대한 Java Tutorials 예제를 사용하고 있습니다. 이 예제에서는 JLabel의 하위 클래스를 사용하여 뷰포트 뷰에 이미지를 표시합니다. 행/열 머리글 (Rule.java example code)을 표시하기 위해 샘플 코드를 사용했으며 기괴한 결과에 당황했습니다. 마침내 getClipBounds() (행/열 머리글의 어떤 영역이 해당 영역 만 칠할 수 있는지 확인하는 데 사용됨) 호출을 제거하고 전체 머리글을 그렸으며 문제가 해결되었습니다. 즉, 이제 전체 영역 (행/열 머리글과 기본 뷰포트 모두)을 그립니다. 그것은 나를 최적이 아닌 것으로 치게한다.Java : (JScrollPane) 뷰포트 뷰의 가시 영역 만 페인트 할 책임이 있습니까?

  1. Java Tutorials 예제가 올바르게 작동하는 이유는 누구나 설명 할 수 있습니까? (소스는 예제에서 실행되는 것과 다릅니다)?
  2. 부분적으로 만 표시 되더라도 전체 창을 그리는 것이 맞습니까?
  3. 행/열 머리글과 주 뷰포트에 대해 뷰포트에 표시되는 전체 개체의 영역을 결정할 수 있도록 어떻게 그 영역을 페인트 할 수 있습니까?

UPDATE :

내가 대신 Graphics.getClipBounds의 JComponent.getVisibleRect을()()를 사용하면 일이 제대로 작동하는 예는 작동하지만, 내가 찾은 이유는 아직 모른다

예상대로 이 방법이 올바른지 확실하지 않은 경우

+0

우리는 귀하의 코드가 귀하의 사유가 작동하지 않는 이유를 알 필요가 있습니다. – Michael

답변

1

JComponent.getVisibleRect()가 트릭입니다. 분명히 getClipBounds()의 의미/사용법을 오해하고 있습니다.

2

아래에서이 코드를 살펴보십시오. 나는 단지 보이는 부분을 그렸습니다.

@Override 
public void paint(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    Rectangle view = new Rectangle(); 
    if (getParent() instanceof JViewport) { 
     JViewport vp = (JViewport) getParent(); 
     view = vp.getViewRect(); 
    } else { 
     view = new Rectangle(0, 0, getWidth(), getHeight()); 
    } 

    g2d.setColor(getBackground()); 
    g2d.fillRect((int) view.getX(), (int) view.getY(), (int) view.getWidth(), (int) view.getHeight()); 

    g2d.setColor(Color.YELLOW); 
    double x = view.getX(); 
    double y = view.getY(); 
    double w = view.getWidth(); 
    double h = view.getHeight(); 

    // draw Strings 
    for (StringShape ss : stringList) { 
     Rectangle sb = ss.getRectangle(g2d.getFontMetrics(ss.getFont())); 
     if (containShape(view, sb)) { 
      g2d.setFont(ss.getFont()); 
      g2d.setColor(ss.getColor()); 
      g2d.drawString(ss.getString(), (int) sb.getX(), (int) sb.getY()); 

     } 
    } 

}