2010-05-05 5 views
3

자, Java 프로그램을 사용하여 FlowLayout에 SVG 인 타일을 표시합니다. ScrabbleRack 클래스이며 JPanel을 확장 한 다음 JSVGCanvas 타일을이 패널에 추가하여이 작업을 수행합니다.Java에서 SVG가 올바르게 표시되지 않습니다.

나중에 프레임을 만들고 패널을 추가했습니다. (포장하여 표시). 나타나면 패널이 제대로 표시되지 않습니다. 단지 첫 번째 타일을 표시 한 다음 나머지 타일을 표시해야하는 공간에 흰색 영역이 표시됩니다.

그러나 프레임의 크기를 임의로 조정하면 이미지가 올바르게 렌더링됩니다.

public class ScrabbleRackGUI extends JPanel{ 
    ScrabbleRack rack=new ScrabbleRack(); 
    JSVGCanvas rackContentsImages[]=new JSVGCanvas[8]; 

public ScrabbleRackGUI() { 
    setLayout(new FlowLayout()); 
    createComponents(); 
} 
public void createComponents() { 
    //INITIALISE SOURCE IMAGES 
    initImages(); 
    for (int i=0;i<rackContentsImages.length;i++){ 
     this.add(rackContentsImages[i]); 
    } 
} 
private void initImages(){ 
    File tempImages[]=new File[8]; 
    for(int i=0;i<8;i++){ 
     tempImages[i]= new File("./src/res/rackBackground.svg"); 
     rackContentsImages[i]=new JSVGCanvas(); 
     try { 
      rackContentsImages[i].setURI(tempImages[i].toURL().toString()); 
     } catch (MalformedURLException ex) { 
      Logger.getLogger(ScrabbleBoardGUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
public static void main(String args[]) 
{ 
    JFrame frame = new JFrame("ScrabbleTest"); 
    ScrabbleRackGUI rack= new ScrabbleRackGUI(1); 
    frame.add(rack); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setSize(214,70); 
    frame.setVisible(true); 

} 
} 

처음으로이 패널을 올바르게 표시하는 방법에 대한 아이디어.

또는 프로그램 끝 부분에서 크기를 조정할 수있는 해킹입니다.


나는이 문제를 재현하고자하는 사람들을위한 자바에서 SVGs를 렌더링하는 batik을 사용했다.

+0

우리가 스크린 샷을 볼 수 – Rekin

+1

그것은 "자바"가 아닌 "JAVA"의 [자바 약어하지 않습니다 (HTTP를 :.?. // java.sun.com/products/jdk/faq.html#B1) –

답변

0

이 여기에보고 바틱 문제 35922과 관련이있을 수 있습니다() 처음에는 제대로 그 버그 리포트를 이해한다면 https://issues.apache.org/bugzilla/show_bug.cgi?id=35922

, 당신은 JSVGCanvas 인스턴스를 추가 (그리고 ScrabbleRackGUI 인스턴스)와 팩을 호출하여 문제를 해결할 수 있습니다 각 JSVGCanvas에 URI를 설정하십시오.

1

문제점 EDT에서 GUI 구성이 수행되고 있지 않다는 것입니다. MyWindow 생성자에 있어야 현재 주에

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      MyWindow window = new MyWindow(); 
      MyWindow.setVisible(true); 
      } 
     }); 
    } 

하고 나머지 코드 :

주 같은 것을 보일 것입니다.

더 자세한 정보는 모두 (다른 장소들) http://leepoint.net/JavaBasics/gui/gui-commentary/guicom-main-thread.html

+0

+1 EDT 실패를 확인하는 데 +1하면 가장 이상한 결과가 발생할 수 있습니다. – Waldheinz

0

첫 번째에서 찾을 수 있습니다, 당신은 썼다 : ScrabbleRackGUI는 = 새로운 ScrabbleRackGUI 랙 (1); 그리고 int를 사용하는 생성자가 없습니다.

둘째, FlowLayout을 JPanel 구성 요소로 설정하고 JPanel은 기본적으로 FlowLayout을 레이아웃으로 설정합니다. 더 나은 호출 super(); JPanel의 모든 이점을 누릴 수 있습니다.

EDT (Event Dispatching Thread) 내부에서 응용 프로그램을 실행 해보십시오. SwingUtilities.invokeLater (새의 Runnable() { // 여기에 코드 } 또한

이처럼 URI를 설정해야합니다.. setURI (f.toURI() toURL의 toString()()); . f.toURL()가 사용되지 않기 때문에

나는 그것이 도움이되기를 바랍니다

관련 문제