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() 메소드는 아래와 같습니다 :
다양한 페이지를 표시하기 위해 CardLayout을 사용하고 있습니까? 수직으로 페이지 바로 아래에있는 각 페이지입니까? – MeBigFatGuy