2013-04-15 3 views
2

문자열을 그리는 직사각형을 페인트하고 있습니다. 이 문자열은 가운데에 위치해야하며 (작동합니다) 크기가 조정되어 "all"문자열이이 사각형에 맞습니다.센터 및 크기 조정 사각형의 문자열

센터링은 작동하지만 어쨌든이 질문을 포함 시키므로이 질문은 직사각형에 문자열을 가운데 맞추고 크기를 조정하려는 다른 사람들에게 도움이 될 수 있습니다.

문제는 While 루프가 무한하다는 것입니다.

public void paint(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

     ... other paintings ... 

    // resize string 
    Rectangle2D fontRec = font.getStringBounds(information, g2.getFontMetrics().getFontRenderContext()); 
    while(fontRec.getWidth() >= width * 0.95f || fontRec.getHeight() >= height * 0.95f){ 
     Font smallerFont = font.deriveFont((float) (font.getSize() - 2)); 
     font = smallerFont; 
     g2.setFont(smallerFont); 
     fontRec = smallerFont.getStringBounds(information, g2.getFontMetrics().getFontRenderContext()); 
    } 

    // center string 
    FontMetrics fm = g2.getFontMetrics(); 
    float stringWidth = fm.stringWidth(information); 
    int fontX = (int) (x + width/2 - stringWidth/2); 
    int fontY = (int) (y + height/2); 
    g2.drawString(information, fontX, fontY); 

} 

이 코드 센터와 제대로 문자열의 크기를 조정 : Rectangle2D를 항상

public void paint(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

    ... other paintings ... 

    Font font = new Font("Courier new", Font.BOLD, MAX_FONTSIZE); 

    // resize string 
    Rectangle2D fontRec = font.getStringBounds(information, g2.getFontMetrics().getFontRenderContext()); 
    while(fontRec.getWidth() >= width * 0.95f || fontRec.getHeight() >= height * 0.95f){ 
     Font smallerFont = font.deriveFont((float) (font.getSize() - 2)); 
     g2.setFont(smallerFont); 
     fontRec = smallerFont.getStringBounds(information, 
     g2.getFontMetrics().getFontRenderContext()); 
    } 

    // center string 
    FontMetrics fm = g2.getFontMetrics(); 
    float stringWidth = fm.stringWidth(information); 
    int fontX = (int) (x + width/2 - stringWidth/2); 
    int fontY = (int) (y + height/2); 
    g2.drawString(information, fontX, fontY); 
} 

보정은 ... 같은 크기를 갖는다.

+0

정확성과 관련하여 각 루프의 smallFont에 대해 간단히 파생하는 것이 더 간단한 문제입니다. - IMHO – MadProgrammer

+1

이이를 수정했습니다. – Aaron

답변

1

font을 업데이트하지 않으려면 smallerFont 자체가 루프 전체에서 동일한 값으로 유지됩니다.

+1

g2.setFont (smallerFont)를 설정했습니다. 그리고 그 후 더 작은 글꼴로 fontRec를 업데이트하십시오. – Aaron

+0

그러나'font.deriveFont ((float) (font.getSize() - 2));)를 사용하고'font'는 같은 값을 유지합니다. –

+1

그러나 font.deriveFont()는 smallerFont에 할당 된 Font 객체를 반환합니까? – Aaron