Java 如何在滚动窗格上放置多个标签?为什么将此标签放置在中心?

Java 如何在滚动窗格上放置多个标签?为什么将此标签放置在中心?,java,swing,Java,Swing,我正在尝试制作一个提要框,其中显示从服务器到客户端的所有更新。在Jframe上,我放置了一个JScrollPane,以便客户端可以轻松看到更多的提要 在JScrollPane上,我试图放置一个JLabel,然后它看起来像这样: 标签被放置在中间,如果我试图放置一个新的JLabel,尽管IDE的导航窗口显示,它已经被放置,但我看不到它。默认情况下,封闭的JFrame的布局已设置为自由设计。我试着改变流量布局,但没有帮助 为什么JLabel被放置在窗口的中心?这是从服务器向客户端显示提要的正确方式

我正在尝试制作一个提要框,其中显示从服务器到客户端的所有更新。在
Jframe
上,我放置了一个
JScrollPane
,以便客户端可以轻松看到更多的提要

JScrollPane
上,我试图放置一个
JLabel
,然后它看起来像这样:

标签被放置在中间,如果我试图放置一个新的
JLabel
,尽管IDE的导航窗口显示,它已经被放置,但我看不到它。默认情况下,封闭的
JFrame
的布局已设置为自由设计。我试着改变流量布局,但没有帮助

为什么
JLabel
被放置在窗口的中心?这是从服务器向客户端显示提要的正确方式吗?

讨论的内容将RSS提要中的条目添加到
JTextPane
。我在下面举例说明了一种变化

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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;

/**
 * @see https://stackoverflow.com/a/19164649/230513
 * @see https://stackoverflow.com/q/10461087/230513
 */
public class NewsFeed extends JPanel {
    public NewsFeed() {
        this.setLayout(new GridLayout());
        JTextPane newsPane = new JTextPane();
        newsPane.setContentType("text/html");
        newsPane.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(newsPane);
        scrollPane.setVerticalScrollBarPolicy(
            javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        RSS reader = RSS.getInstance();
        String rssNews = reader.writeNews();
        newsPane.setText(rssNews);
        this.add(scrollPane);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("News");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new NewsFeed());
                f.pack();
                f.setSize(640, 480);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }

    private static class RSS {

        private static final String NAME =
            "http://thestar.com.my.feedsportal.com/c/33048/f/534600/index.rss";
        private static RSS instance = null;

        public static RSS getInstance() {
            if (instance == null) {
                instance = new RSS();
            }
            return instance;
        }

        public String writeNews() {
            String result = "";
            try {
                DocumentBuilder builder = DocumentBuilderFactory
                    .newInstance().newDocumentBuilder();
                URL u = new URL(NAME);
                Document doc = builder.parse(u.openStream());
                NodeList nodes = doc.getElementsByTagName("item");
                for (int i = 0; i < nodes.getLength(); i++) {
                    Element element = (Element) nodes.item(i);
                    result += "Title: " + getElementValue(element, "title") + "<br>";
                    result += "Link: " + getElementValue(element, "link") + "<br>";
                    result += "Publish Date: " + getElementValue(element, "pubDate") + "<br>";
                    result += "Description: " + getElementValue(element, "description") + "<br>";
                }
            } catch (Exception ex) {
                ex.printStackTrace(System.err);
            }
            return result;
        }

        private String getCharacterDataFromElement(Element e) {
            try {
                Node child = e.getFirstChild();

                if (child instanceof CharacterData) {
                    CharacterData cd = (CharacterData) child;
                    return cd.getData();
                }
            } catch (Exception ex) {
                ex.printStackTrace(System.err);
            }
            return "";
        }

        protected float getFloat(String value) {
            if (value != null && !value.equals("")) {
                return Float.parseFloat(value);
            }
            return 0;
        }

        protected String getElementValue(Element parent, String label) {
            return getCharacterDataFromElement(
                (Element) parent.getElementsByTagName(label).item(0));
        }
    }
}

导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.net.URL;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.CharacterData;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
/**
*@见https://stackoverflow.com/a/19164649/230513
*@见https://stackoverflow.com/q/10461087/230513
*/
公共类新闻提要扩展了JPanel{
公共新闻提要(){
this.setLayout(新的GridLayout());
JTextPane newsPane=新的JTextPane();
setContentType(“text/html”);
newsPane.setEditable(false);
JScrollPane scrollPane=新的JScrollPane(新闻窗格);
scrollPane.setVerticalScrollBarPolicy(
javax.swing.ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
RSS reader=RSS.getInstance();
字符串rssNews=reader.writeNews();
newsPane.setText(rssNews);
添加(滚动窗格);
}
公共静态void main(字符串参数[]){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新JFrame(“新闻”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(NewsFeed());
f、 包装();
f、 设置大小(640480);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
});
}
私有静态类RSS{
私有静态最终字符串名=
"http://thestar.com.my.feedsportal.com/c/33048/f/534600/index.rss";
私有静态RSS实例=null;
公共静态RSS getInstance(){
if(实例==null){
instance=newrss();
}
返回实例;
}
公共字符串writeNews(){
字符串结果=”;
试一试{
DocumentBuilder=DocumentBuilderFactory
.newInstance().newDocumentBuilder();
URL u=新的URL(名称);
documentdoc=builder.parse(u.openStream());
NodeList节点=doc.getElementsByTagName(“项”);
对于(int i=0;i”;
结果+=“链接:”+getElementValue(元素,“链接”)+“
”; 结果+=“发布日期:”+getElementValue(元素,“发布日期”)+“
”; 结果+=“描述:”+getElementValue(元素,“描述”)+“
”; } }捕获(例外情况除外){ 例如printStackTrace(System.err); } 返回结果; } 私有字符串getCharacterDataFromElement(元素e){ 试一试{ Node child=e.getFirstChild(); if(CharacterData的子实例){ CharacterData cd=(CharacterData)子级; 返回cd.getData(); } }捕获(例外情况除外){ 例如printStackTrace(System.err); } 返回“”; } 受保护的浮点getFloat(字符串值){ if(value!=null&&!value.equals(“”){ 返回Float.parseFloat(值); } 返回0; } 受保护的字符串getElementValue(元素父级,字符串标签){ 返回getCharacterDataFromElement( (Element)parent.getElementsByTagName(label.item(0)); } } }
讨论的方法将RSS提要中的条目添加到
JTextPane
。我在下面举例说明了一种变化

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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;

/**
 * @see https://stackoverflow.com/a/19164649/230513
 * @see https://stackoverflow.com/q/10461087/230513
 */
public class NewsFeed extends JPanel {
    public NewsFeed() {
        this.setLayout(new GridLayout());
        JTextPane newsPane = new JTextPane();
        newsPane.setContentType("text/html");
        newsPane.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(newsPane);
        scrollPane.setVerticalScrollBarPolicy(
            javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        RSS reader = RSS.getInstance();
        String rssNews = reader.writeNews();
        newsPane.setText(rssNews);
        this.add(scrollPane);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("News");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new NewsFeed());
                f.pack();
                f.setSize(640, 480);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }

    private static class RSS {

        private static final String NAME =
            "http://thestar.com.my.feedsportal.com/c/33048/f/534600/index.rss";
        private static RSS instance = null;

        public static RSS getInstance() {
            if (instance == null) {
                instance = new RSS();
            }
            return instance;
        }

        public String writeNews() {
            String result = "";
            try {
                DocumentBuilder builder = DocumentBuilderFactory
                    .newInstance().newDocumentBuilder();
                URL u = new URL(NAME);
                Document doc = builder.parse(u.openStream());
                NodeList nodes = doc.getElementsByTagName("item");
                for (int i = 0; i < nodes.getLength(); i++) {
                    Element element = (Element) nodes.item(i);
                    result += "Title: " + getElementValue(element, "title") + "<br>";
                    result += "Link: " + getElementValue(element, "link") + "<br>";
                    result += "Publish Date: " + getElementValue(element, "pubDate") + "<br>";
                    result += "Description: " + getElementValue(element, "description") + "<br>";
                }
            } catch (Exception ex) {
                ex.printStackTrace(System.err);
            }
            return result;
        }

        private String getCharacterDataFromElement(Element e) {
            try {
                Node child = e.getFirstChild();

                if (child instanceof CharacterData) {
                    CharacterData cd = (CharacterData) child;
                    return cd.getData();
                }
            } catch (Exception ex) {
                ex.printStackTrace(System.err);
            }
            return "";
        }

        protected float getFloat(String value) {
            if (value != null && !value.equals("")) {
                return Float.parseFloat(value);
            }
            return 0;
        }

        protected String getElementValue(Element parent, String label) {
            return getCharacterDataFromElement(
                (Element) parent.getElementsByTagName(label).item(0));
        }
    }
}

导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.net.URL;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.CharacterData;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
/**
*@见https://stackoverflow.com/a/19164649/230513
*@见https://stackoverflow.com/q/10461087/230513
*/
公共类新闻提要扩展了JPanel{
公共新闻提要(){
this.setLayout(新的GridLayout());
JTextPane newsPane=新的JTextPane();
setContentType(“text/html”);
newsPane.setEditable(false);
JScrollPane scrollPane=新的JScrollPane(新闻窗格);
scrollPane.setVerticalScrollBarPolicy(
javax.swing.ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
RSS reader=RSS.getInstance();
字符串rs