2011-05-11 2 views
1

Java에서 XFDL 렌더링 응용 프로그램을 개발 중입니다. XFDL은 XML의 확장 인 양식 정의 언어입니다.JPanel에 잘못된 선이 그려졌습니다.

렌더링 클래스는 StAX를 사용하여 문서를 처리하고 사용자 정의 된 JPanel에 필요한 항목을 추가하여 표시합니다. 성공적으로 필드 (JTextFields) 및 레이블 (JLabels) JPanel 줄을 추가하는 데 성공했습니다 문제가되었습니다. 여러 페이지가있는 양식을 만들 때 모든 양식의 양식을 표시 할 때 마지막 페이지의 양식이 양식에 표시됩니다.

아래 코드를 살펴본 결과이 문제의 원인을 찾을 수 없습니다. 단계를 거치면 모든 카운터가 올바르게 증가하여 줄이 적절한 페이지에 추가되지만 항상 레이블 및 필드의 현재 페이지 뒤에 줄의 마지막 페이지가 표시됩니다.

Java에서 드로잉을 처리하는 방법에 대해 오해 한 것 같습니다.하지만 확실하지 않습니다.

미리 답변 해 주시면 감사하겠습니다. XFDL 문서 라인에서

는 같은 정의된다

private ArrayList<FormPanel> pages; 

/** 
* Draws a new line on the Panel 
* 
* Start State: Cursor is positioned on the <line> start element. 
* End State: Cursor is positioned on the <line> end element. 
* 
* @throws XMLStreamException 
*/ 
private void addLine() throws XMLStreamException { 
    while(reader.hasNext() && 
      !(reader.isEndElement() && 
        reader.getLocalName().equals(XFDL_LINE))) { 

     reader.next(); 
     if(reader.isStartElement()) { 
      if(reader.getLocalName().equals(XFDL_ITEMLOCATION)) { 
       pages.get(currentPage).addLine(processItemLocation()); 
      } 
     } 
    } 

} 

/** 
* Processes an item location field into a Rectangle object used to set 
* the bounds and location of form item. 
* Start State: Cursor positioned on the itemlocation start element. 
* End State: Cursor positioned on the itemlocation end element 
* 
* Currently only handles absolute positioning and extent sizes. 
* Any other form of positioning data returns null. 
* 
* @return Rectangle representing the location and size of item. 
* @throws XMLStreamException 
*/ 
private Rectangle processItemLocation() throws XMLStreamException { 
    Rectangle result = new Rectangle(); 

    ArrayList<String> attributes = new ArrayList<String>(); 

    while(reader.hasNext() && 
      !(reader.isEndElement() && 
        reader.getLocalName().equals(XFDL_ITEMLOCATION))) 
    { 
     reader.next(); 
     if(reader.isCharacters() && !reader.isWhiteSpace()) { 
      attributes.add(reader.getText()); 
     } 
    } 

    for(int x=0; x<attributes.size(); x++) { 
     if(attributes.get(x).equals(XFDL_LOCATION_STYLE_ABSOLUTE)) { 
      result.setLocation(Integer.parseInt(attributes.get(x+1)), 
        Integer.parseInt(attributes.get(x+2))); 
     } else if(attributes.get(x).equals(XFDL_LOCATION_SIZE_EXTENT)) { 
      result.setSize(Integer.parseInt(attributes.get(x+1)), 
        Integer.parseInt(attributes.get(x+2))); 
     } else { 
      try{ 
       Integer.parseInt(attributes.get(x)); 
      } catch (NumberFormatException nfe) { 
       result = null; 
       x = attributes.size(); 
      } 
     } 
    } 

    return result; 
} 

은 FormPanel가 추가로 JPanel의 확장자이다 렌더링 클래스는 다음과 같은 방법이라고 태그 도달

<page SID="PAGE1"> 
     <line sid="LINE1"> 
     <itemlocation> 
      <ae> 
       <ae>absolute</ae> 
       <ae>1219</ae> 
       <ae>75</ae> 
      </ae> 
      <ae> 
       <ae>extent</ae> 
       <ae>3</ae> 
       <ae>854</ae> 
      </ae> 
     </itemlocation> 
     </line> 
     ... 
</page> 
<page SID="PAGE2"> 
     <line sid="LINE2"> 
     <itemlocation> 
      <ae> 
       <ae>absolute</ae> 
       <ae>1219</ae> 
       <ae>75</ae> 
      </ae> 
      <ae> 
       <ae>extent</ae> 
       <ae>3</ae> 
       <ae>854</ae> 
      </ae> 
     </itemlocation> 
     </line> 
     ... 
</page> 

addLine() 메소드와 오버라이드 된 paintComponent() 메소드는 아래와 같습니다 :

+0

다양한 페이지를 표시하기 위해 CardLayout을 사용하고 있습니까? 수직으로 페이지 바로 아래에있는 각 페이지입니까? – MeBigFatGuy

답변

1

새 페이지를 열면 전화해야합니다.

lines.clear(); 

각 페이지가 자신의 컨테이너라고 가정합니다.

물론 lines 변수는 정적으로 정의되므로 전체 문서에 대해 한 줄의 컨테이너가 있습니다. 하나는 페이지 당 하나를 원한다고 생각할 수 있으므로 정적 사용은 의문의 여지가 있습니다.

+0

ArrayList 라인에 정적 수정자를 쓰는 것도 기억이 안납니다. 그것을 떨어 뜨리고 모든 것이 함께 맞았습니다. – MrWizard54