2013-01-21 4 views
1

Je cette classe, ce qui devrait ajouter un JLabel à un JPanel, mais pour une raison quelconque, il ne le fait pas. Pourquoi ne pas ajouter le JLabel au JPanel? Cela se passe dans ma classe SwigWorker dans la méthode done()JLabel pas ajouté à JPanel

package sscce; 

import java.io.IOException; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.util.ArrayList; 
import javax.swing.JLabel; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.w3c.dom.CharacterData; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class sscce extends javax.swing.JFrame{ 
    protected XML xml = new XML(); 

    public sscce(){ 
     initComponents(); 
     GetNotes getNotes = new GetNotes(); 
     getNotes.execute(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     notesPanel = new javax.swing.JPanel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     javax.swing.GroupLayout notesPanelLayout = new javax.swing.GroupLayout(notesPanel); 
     notesPanel.setLayout(notesPanelLayout); 
     notesPanelLayout.setHorizontalGroup(
      notesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 494, Short.MAX_VALUE) 
     ); 
     notesPanelLayout.setVerticalGroup(
      notesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 433, Short.MAX_VALUE) 
     ); 

     jScrollPane1.setViewportView(notesPanel); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 496, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 435, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold> 

    public static void main(String args[]){ 
     try{ 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     }catch( ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex){ 
      java.util.logging.Logger.getLogger(sscce.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable(){ 
      public void run(){ 
       new sscce().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JPanel notesPanel; 
    // End of variables declaration 

    public class GetNotes extends SwingWorker{ 

     protected ArrayList<XML> notes; 

     @Override 
     public void done(){ 
      System.out.println(notes.size()); 
      for(XML note : notes){ 
       String n = note.getNode("notes", "note"); 
       System.out.println(n); 
       JLabel lbl = new JLabel(n); 
       lbl.setVisible(true); 
       notesPanel.add(lbl); 
      } 
     } 

     @Override 
     public String doInBackground(){ 
      String xmlStr = "<?xml version=\"1.0\"?>" 
        + "<root>" 
        + " <success>true</success>" 
        + " <notes>" 
        + "  <note>Note 1</note>" 
        + " </notes>" 
        + " <notes>" 
        + "  <note>Note 2</note>" 
        + " </notes>" 
        + " <notes>" 
        + "  <note>Note 3</note>" 
        + " </notes>" 
        + "</root>"; 
      xml.parse(xmlStr); 
      notes = xml.getNodes("root", "notes"); 
      return null; 
     } 
    } 
} 

class XML{ 

    private Document doc; 

    public XML(){ 
    } 

    public void parse(String xml){ 
     try{ 
      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xml)); 

      doc = db.parse(is); 
     }catch(ParserConfigurationException | SAXException | IOException ex){ 
      //Logger.getLogger(XML.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public Document getDoc(){ 
     return this.doc; 
    } 

    public ArrayList<XML> getNodes(String root, String name){ 
     ArrayList<XML> elList = new ArrayList<>(); 
     NodeList nodes = doc.getElementsByTagName(root); 
     for(int i = 0; i < nodes.getLength(); i++){ 
      Element element = (Element)nodes.item(i); 
      NodeList nl = element.getElementsByTagName(name); 
      for(int c = 0; c < nl.getLength(); c++){ 
       Element e = (Element)nl.item(c); 
       String xmlStr = this.nodeToString(e); 
       XML xml = new XML(); 
       xml.parse(xmlStr); 
       elList.add(xml); 
      } 
     } 
     return elList; 
    } 

    private String nodeToString(Node node){ 
     StringWriter sw = new StringWriter(); 
     try{ 
      Transformer t = TransformerFactory.newInstance().newTransformer(); 
      t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
      t.transform(new DOMSource(node), new StreamResult(sw)); 
     }catch(TransformerException te){ 
      System.out.println("nodeToString Transformer Exception"); 
     } 
     return sw.toString(); 
    } 

    public String getNode(String root, String name){ 
     NodeList nodes = doc.getElementsByTagName(root); 
     for(int i = 0; i < nodes.getLength(); i++){ 
      Element element = (Element)nodes.item(i); 

      NodeList n = element.getElementsByTagName(name); 
      Element e = (Element)n.item(0); 
      return getCharacterDataFromElement(e); 
     } 
     return ""; 
    } 

    public static String getCharacterDataFromElement(Element e){ 
     Node child = e.getFirstChild(); 
     if(child instanceof CharacterData){ 
      CharacterData cd = (CharacterData)child; 
      return cd.getData(); 
     } 
     return ""; 
    } 
} 
+1

Commencez par changer le gestionnaire de mise en page pour le 'notesPanel' autre chose alors' GroupLayout' - ce gestionnaire de mise en page est vraiment pas destiné à être manipulé manuellement. – MadProgrammer

+0

J'ai essayé: Gridbag, flow, box, et aucun d'eux n'a fonctionné. –

+0

Voir ma réponse, aussi +1 pour un exemple de course, merci – MadProgrammer

Répondre

2

1- Changer le gestionnaire de mise en page pour le notesPanel. GroupLayout n'est vraiment pas conçu pour un codage manuel comme celui-ci. Dans mon test, j'ai utilisé FlowLayout.

//  javax.swing.GroupLayout notesPanelLayout = new javax.swing.GroupLayout(notesPanel); 
//  notesPanel.setLayout(notesPanelLayout); 
//  notesPanelLayout.setHorizontalGroup(
//     notesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
//    .addGap(0, 494, Short.MAX_VALUE)); 
//  notesPanelLayout.setVerticalGroup(
//     notesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
//    .addGap(0, 433, Short.MAX_VALUE)); 
     notesPanel.setLayout(new FlowLayout()); 

2- Ajouter un appel à JComponent#validate une fois que vous avez fini d'ajouter les étiquettes.

System.out.println(notes.size()); 
for (XML note : notes) { 
    String n = note.getNode("notes", "note"); 
    System.out.println(n); 
    JLabel lbl = new JLabel(n); 
    lbl.setVisible(true); 
    notesPanel.add(lbl); 
} 
notesPanel.validate(); 

Cela devrait encourager le cadre à re-mettre en page ses composants enfants.

+0

Ahh! Merci! J'ai oublié que j'avais besoin de le valider. –

Questions connexes