JLabel

2012-01-23 5 views
1

I am using JLabel으로 만든 이미지의 "기본 크기"를 가져 와서 문자열에서 이미지 파일을 만듭니다.JLabel

I 달리 I 예외 얻을, 화상 사이즈 (label.setSize(width, height))를 지정할 수있다 : I는 폰트 또는 문자를 사용하는 경우

java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0 
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016) 
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:338) 
    at com.shopsnips.portal.services.ImageCreator.createFromText(ImageCreator.java:31) 
    at com.shopsnips.portal.services.ImageCreator.main(ImageCreator.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

제가

label.setFont(new Font("Serif", Font.BOLD, 26)); 

사용 폰트 크기를 제어 할 수있는 그런 가 너무 커서 고정 된 크기에 맞지 않으면 레이블이 잘리고 "..."가 대신 포함됩니다. 설정 한 크기에 맞는 최적/최대 글꼴 크기를 식별하는 방법이 있습니까?

또는 현재 설정 (글꼴 크기 + 크기)으로 인해 텍스트가 잘리지 않을지 어떻게 알 수 있습니까?

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class ImageCreator { 
    private ImageCreator(){} 

    private final static String FONT = "Freestyle Script"; 

    public static void main(String[] args) { 
     Path outputFile = Paths.get("c:\\tmp\\img\\test.png"); 

     createFromText("Hello World - this is a long text", outputFile, 150, 50); 
    } 

    /** 
* <p>Create an image from text. <p/> 
* <p/> 
* https://stackoverflow.com/a/4437998/11236 
*/ 
    public static void createFromText(String text, Path outputFile, int width, int height) { 
     JLabel label = new JLabel(text, SwingConstants.CENTER); 
     label.setSize(width, height); 
     label.setFont(new Font(FONT, Font.BOLD, 24)); 

     BufferedImage image = new BufferedImage(
       label.getWidth(), label.getHeight(), 
       BufferedImage.TYPE_INT_ARGB); 

     Graphics g = null; 
     try { 
      // paint the html to an image 
      g = image.getGraphics(); 
      g.setColor(Color.BLACK); 
      label.paint(g); 
     } finally { 
      if (g != null) { 
       g.dispose(); 
      } 
     } 

     // get the byte array of the image (as jpeg) 
     try { 
      ImageIO.write(image, "png", outputFile.toFile()); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

언급하려면 로그인하세요 : 여기

는 일부 소스입니다.

답변

2

1)에 해당하는 경우

2) LayoutManager

@Jeffrey 3) 답이 정답에 너무 가까이

, BuferedImage이 작업을 할 수 setSize하지 마십시오 JLabelIconBuferedImage를 넣어 두 치수 모두를 반환 할 수 있습니다

4) 더 나은 도움을 받으려면 모니터에 코드가 보이지 않고 Java 클래스에서 생성 된 예외도없고

에서 생성 된 예외가 있으므로 SSCCE을 더 빨리 보내 주시기 바랍니다.
+0

을에 ... 그것은 꽤 많이 SSCCE입니다. 나는 내 자신의 코드를 게시 할 수 있으며, 매우 아주 가깝다. 크기 설정을 생략하면됩니다. – ripper234

+0

그리고 여기 SSCCE가 있습니다. 나는 내일 직장에서 당신의 대답을 시험해 볼 것입니다. https://gist.github.com/1665287 – ripper234

+0

1) 'SSCCE'또는 '** SSCCE가 아님 **', '가까운'상을 수여 할 수 없습니다. 2) 사람들은 보통 github과 같은 외부 사이트에 대한 링크를 따르지 않습니다. 질문을 소스로 포함시키는 것이 좋습니다. 나는 그것을했다. –

2

label.setFont(new Font("Serif", Font.BOLD, 26)); .. 내가 설정 한 크기에 맞는 최적/최대 글꼴 크기를 식별하는 방법이 있습니까?

텍스트 크기를 얻으려면 FontMetrics 또는 GlyphVector을 찾으십시오.

텍스트의 크기를 가져 오는 '빠르고 지저분한'방법은 레이블 &에 원하는 크기의 레이블을 묻는 것입니다.

이 그림을 보면 글꼴 크기가 그에 따라 조정될 수 있습니다.

+0

내가 FontMetrics +1을 깜빡했다. – mKorbel

0

나는 주어진 답변을 좋아하지 않습니다. (또는 지금 당장 사용하기에 충분하지 않습니다.)

는 대신, 난 그냥 글꼴 크기 선택이 추론을 사용 : 내가 링크 된 게시물을 사용하고

private static int chooseFontSize(String text) { 
    int largeFont = 28; 
    int mediumFont = 22; 
    int tinyFont = 16; 
    if (text.length() > 25) { 
     return tinyFont; 
    } 
    if (text.length() > 15) { 
     return mediumFont; 
    } 
    return largeFont; 
}