Question

Je développe une application de rendu XFDL en Java. XFDL est un langage de définition de formulaire qui est une extension de XML.

La classe de rendu utilise Stax pour traiter le document et ajoute les éléments requis à un JPanel personnalisé pour l'affichage. J'ai réussi à ajouter correctement les champs (jTextfields) et les étiquettes (JLabels) aux lignes JPanel sont devenues un problème. Lors de la création d'un formulaire avec plusieurs pages, chaque fois que j'affiche le formulaire, chaque page obtient les lignes de la dernière page du formulaire.

J'ai parcouru mon code (illustré ci-dessous) et je ne peux pas proposer une cause de ce comportement. Lorsque je passe à travers, tous les compteurs augmentent correctement afin que les lignes soient ajoutées aux pages appropriées, mais j'obtiens toujours la dernière page des lignes derrière la page actuelle des étiquettes et des champs.

Je soupçonne que j'ai mal compris quelque chose sur la façon dont Java gère le dessin, mais je ne sais pas quoi.

Merci d'avance pour les réponses et les conseils.

Dans les lignes de documents XFDL, sont définies comme telles:

<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>

Lorsque la classe de rendu atteint une étiquette, la méthode suivante est appelée:

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 est une extension de JPanel avec une méthode supplémentaire addline () et une peinturecomponent remplacée () ci-dessous:

private static ArrayList<Rectangle> lines;

public void addLine(Rectangle line) {
    lines.add(line);
}

/**
 * Overrides JPanel paintComponenet and draws lines on the form.
 */
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    for(int x = 0; x<lines.size(); x++) {
        g.drawRect(lines.get(x).x, 
                lines.get(x).y, 
                lines.get(x).width, 
                lines.get(x).height);
        g.fillRect(lines.get(x).x, 
                lines.get(x).y, 
                lines.get(x).width, 
                lines.get(x).height);
    }
}

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top