有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将控制台的输出放到java中的swing Gui

我是java新手,正在尝试以下示例。使用下面的代码,我可以打印XML文件的所有节点。现在我想使用Swing并将其放在一个简单的Swing窗口中

我知道如何创建窗口,但如何将控制台输出连接到JTextArea?我在堆栈溢出上搜索它,但没有得到正确的想法

public static void main(String[] args) throws IOException 
{
    try  
    { 
        File file = new File("dum.xml");
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
        Document document = documentBuilder.parse(file); 
        System.out.println("Root element: "+ document.getDocumentElement().getNodeName()); 
        if (document.hasChildNodes())  
        { 
            printNodeList(document.getChildNodes());
        } 
    }  
    catch (Exception e) 
    { 
        System.out.println(e.getMessage()); 
    } 
} 

private static void printNodeList(NodeList nodeList) 
{ 
    for (int count = 0; count < nodeList.getLength(); count++)
    { 
        Node elemNode = nodeList.item(count); 
        if (elemNode.getNodeType() == Node.ELEMENT_NODE)  
        { 
            // get node name and value 
            System.out.println("\nZeilenname =" + elemNode.getNodeName()+ " [Anfang]");
            System.out.println("Zeileninhalt =" + elemNode.getTextContent()); 
            if (elemNode.hasAttributes())  
            {
                NamedNodeMap nodeMap = elemNode.getAttributes();
                for (int i = 0; i < nodeMap.getLength(); i++)
                {
                    Node node = nodeMap.item(i);
                    System.out.println("Attributname : " + node.getNodeName()); 
                    System.out.println("Attributwert : " + node.getNodeValue()); 
                }
            }
            if (elemNode.hasChildNodes())  
            {
                //recursive call if the node has child nodes
                printNodeList(elemNode.getChildNodes());
            }
            System.out.println("Zeilenname =" + elemNode.getNodeName()+ " [Ende]"); 
        }
    } 
}

共 (2) 个答案

  1. # 1 楼答案

    创建一个JTextArea。将对System.out.println的所有调用替换为JTextArea.append。下面的代码演示

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.io.File;
    
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class XmlSwing {
        private JTextArea textArea;
    
        private void createAndDisplayGui() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createTextArea(), BorderLayout.CENTER);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private JScrollPane createTextArea() {
            textArea = new JTextArea(20, 40);
            createTextAreaText();
            JScrollPane scrollPane = new JScrollPane(textArea);
            return scrollPane;
        }
    
        private void createTextAreaText() {
            try {
                File file = new File("dum.xml");
                DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                Document document = documentBuilder.parse(file);
                textArea.append("Root element: " + document.getDocumentElement().getNodeName() + "\n");
                if (document.hasChildNodes()) {
                    printNodeList(document.getChildNodes());
                }
            }
            catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
        private void printNodeList(NodeList nodeList) {
            for (int count = 0; count < nodeList.getLength(); count++) {
                Node elemNode = nodeList.item(count);
                if (elemNode.getNodeType() == Node.ELEMENT_NODE) {
                    // get node name and value
                    textArea.append("\nZeilenname =" + elemNode.getNodeName() + " [Anfang]\n");
                    textArea.append("Zeileninhalt =" + elemNode.getTextContent() + "\n");
                    if (elemNode.hasAttributes()) {
                        NamedNodeMap nodeMap = elemNode.getAttributes();
                        for (int i = 0; i < nodeMap.getLength(); i++) {
                            Node node = nodeMap.item(i);
                            textArea.append("Attributname : " + node.getNodeName() + "\n");
                            textArea.append("Attributwert : " + node.getNodeValue() + "\n");
                        }
                    }
                    if (elemNode.hasChildNodes()) {
                        // recursive call if the node has child nodes
                        printNodeList(elemNode.getChildNodes());
                    }
                    textArea.append("Zeilenname =" + elemNode.getNodeName() + " [Ende]\n");
                }
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> new XmlSwing().createAndDisplayGui());
        }
    }
    

    请参阅Creating a GUI With Swing

  2. # 2 楼答案

    这是如何按照最佳实践(即使用SwingUtilities#invokeLater(...)运行Swing应用程序)为Java Swing应用程序创建主框架的方法

    public class SwingDemo {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
        
        private static void createAndShowGUI() {
            JFrame f = new JFrame("Swing Demo");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(250,250);
            f.setVisible(true);
        }
    }
    

    现在需要添加组件以显示文本JLabelJTextFieldJTextArea是主要候选。既然您提到了文本区域,让我们使用该组件。为此,您只需在末尾添加以下两行:

        String text = "Hello World!";
        JTextArea textarea = new JTextArea();
        textarea.setText(text);
        f.add(textarea);
        textarea.append("\nI added this later"); // UPDATE
    

    然后可以修改此示例代码,使其看起来更好。例如,您可以将文本区域放在JPanel中,然后可以使用布局控制面板的位置和大小,以防止文本区域扩展到整个JFrame的大小。但这段极简主义代码正是您想要的,即在JavaSwingGUI中设置文本

    更新:您可以使用append()方法向GUI添加行。例如:

    NamedNodeMap nodeMap = elemNode.getAttributes(); 
    for (int i = 0; i < nodeMap.getLength(); i++)  
    { 
        Node node = nodeMap.item(i); 
        textarea.append("\nAttributname : " + node.getNodeName());
    }