1

我有这个类,它应该向 JPanel 添加一个 JLabel,但由于某种原因它没有这样做。为什么不将 JLabel 添加到 JPanel?这发生在我的SwigWorker课堂上的done()方法中

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 "";
    }
}
4

1 回答 1

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

JComponent#validate2-在添加完标签后添加一个呼叫。

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

这应该鼓励框架重新布局它的子组件。

于 2013-01-21T23:47:01.200 回答