2013-10-03 50 views
0

我試圖製作一個供稿盒,它顯示從服務器到客戶端的所有更新。在Jframe上我放置了JScrollPane,以便客戶端可以輕鬆看到更多數量的供稿。如何在滾動條上放置多個標籤,並將此標籤放置在中心位置?

JScrollPane,我試圖把一個JLabel,然後它看起來像這樣:

enter image description here

標籤被放置在中心,如果我嘗試把新JLabel,雖然導航窗口的IDE顯示,它已經被放置,我看不到它。封裝的JFrame的佈局默認設置爲免費設計。我試圖改變流程佈局但這並沒有幫助。

爲什麼JLabel被放置在窗口的中心?這是從服務器向客戶端顯示提要的正確方式嗎?

+1

你檢查面板的defualtlayout :)更改佈局,並將其放置在您想要 – Optional

+1

爲了得到更好更快的幫助,請提供[SSCCE(http://sscce.org ) –

+1

出於您的目的,「JList」可能比「JLabels」的加載更合適。 – kiheru

回答

3

討論的complete examplehere將來自RSS源的條目添加到JTextPane。我已經在下面說明了一個變化。

news feed

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