2012-04-17 37 views
4

我正在使用Java教程如何使用JScrollPane(帶有行/列標題)的示例。該示例使用JLabel的子類在「視口視圖」中顯示圖像。我使用示例代碼來顯示行/列標題(Rule.java example code),並且在奇怪的結果中感到困惑。我最終刪除了對getClipBounds()的調用(顯然用於確定哪些區域的行/列標題是可見的,只繪製該區域)並繪製整個標題,問題就解決了。這意味着我現在正在繪製整個區域(在行/列標題和主視口中)。這讓我感到非常不理想。Java:我只負責繪製(JScrollPane)視口視圖的可見區域嗎?

  1. 任何人都可以解釋爲什麼Java教程示例工作正常(大於源另一種是不一樣的,在示例中執行)?
  2. 即使只是部分可見,是否可以繪製整個窗格對我來說是否正確?
  3. 如何確定整個對象的哪些區域在視口中可見(對於行/列標題和主視口),以便我可以僅繪製該區域?

UPDATE:

我仍然不知道爲什麼示例工作,但我發現,如果我用JComponent.getVisibleRect()而不是Graphics.getClipBounds()事情似乎工作如預期。不知道這是否正確使用此方法。

+0

我們需要查看您的代碼,告訴您爲什麼您的工作不正常。 – Michael 2012-04-25 16:52:13

回答

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()); 

     } 
    } 

} 
相關問題