2013-01-21 130 views
1

我有這個類,它應該添加一個JLabel到JPanel,但由於某種原因,它沒有這樣做。爲什麼不將JLabel添加到JPanel?這發生在我SwigWorker類的done()方法JLabel未添加到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

首先將'notesPanel'的佈局管理器更改爲'GroupLayout'之外的其他東西 - 這個佈局管理器實際上並不是要手工處理。 – MadProgrammer

+0

我試過了:Gridbag,流量,盒子,都沒有工作。 –

+0

看到我的答案,也爲+1運行的例子,謝謝 – MadProgrammer

回答

2

1更改爲notesPanel佈局管理器。 GroupLayout真的不適合這樣的手工編碼。在我的測試中,我使用了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-完成添加標籤後,添加對JComponent#validate的呼叫。

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(); 

這應該鼓勵框架重新佈置它的子組件。

+0

啊!謝謝!我忘了我需要驗證它。 –