2016-12-26 165 views
-2

我嘗試添加的JPanel到JScrollPane中,再加入JScrollPane的到contentPane的,但它不工作,我讀書在這裏,最peple說添加的JPanel到JScrollPane中,但我仍然無法把它的滾動..java-how to scroll a jpanel?

enter image description here

package org.redeagle.growtopiamarket; 

import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingConstants; 
import javax.swing.border.EmptyBorder; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import javax.swing.ScrollPaneConstants; 

public class Main extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Main frame = new Main(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Main() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 461, 540); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(new GridLayout(0, 1, 0, 0)); 

     JPanel panel = new JPanel(); 
     panel.setBounds(0, 0, 436, 493); 
     panel.setLayout(new GridLayout(0,1)); 

     JScrollPane sp = new JScrollPane(panel); 
     sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
     contentPane.add(sp); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     try { 
      URL urls = new URL("https://growtopiajson.000webhostapp.com/gtpost.xml"); 
      URLConnection conn = urls.openConnection(); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(conn.getInputStream()); 
      doc.getDocumentElement().normalize(); 

      NodeList nList = doc.getElementsByTagName("post"); 

      System.out.println("----------------------------"); 

      for (int temp = 0; temp < nList.getLength(); temp++) { 
       Node nNode = nList.item(temp); 

       System.out.println("\nCurrent Element :" + nNode.getNodeName()); 

       if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
        Element eElement = (Element) nNode; 
        String strImageURL = eElement.getElementsByTagName("imageurl").item(0).getTextContent(); 
        String strItemName = eElement.getElementsByTagName("itemname").item(0).getTextContent(); 
        String strItemDesc = eElement.getElementsByTagName("itemdesc").item(0).getTextContent(); 
        String strItemPrice = eElement.getElementsByTagName("itemprice").item(0).getTextContent(); 
        String strItemSeller = eElement.getElementsByTagName("itemseller").item(0).getTextContent(); 

        JPanel postPanel = new JPanel(); 
        postPanel.setBounds(10, 11, 425, 94); 
        panel.add(postPanel); 
        postPanel.setLayout(null); 

        JLabel image = new JLabel(""); 
        image.setBounds(0, 0, 90, 94); 
        Image images = null; 
        try { 
         URL urlss = new URL("http://www.growtopia.in/images/seeds/seed-info/house-entrance-block.png"); 
         images = ImageIO.read(urlss); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        image.setIcon(new ImageIcon(new ImageIcon(images).getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_DEFAULT))); 
        postPanel.add(image); 

        JLabel itemName = new JLabel(strItemName); 
        itemName.setFont(new Font("Trebuchet MS", Font.BOLD, 21)); 
        itemName.setHorizontalAlignment(SwingConstants.CENTER); 
        itemName.setBounds(100, 0, 315, 32); 
        postPanel.add(itemName); 

        JLabel itemDesc = new JLabel("<html><p>" + strItemDesc + "</p></html>"); 
        itemDesc.setHorizontalAlignment(SwingConstants.LEFT); 
        itemDesc.setBounds(100, 28, 315, 40); 
        postPanel.add(itemDesc); 

        JLabel itemPrice = new JLabel(strItemPrice); 
        itemPrice.setBounds(100, 69, 138, 14); 
        postPanel.add(itemPrice); 

        JLabel itemSeller = new JLabel(strItemSeller); 
        itemSeller.setHorizontalAlignment(SwingConstants.RIGHT); 
        itemSeller.setBounds(248, 69, 167, 14); 
        postPanel.add(itemSeller); 

        panel.add(postPanel); 
       } 
      }  
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

1

你有幾個問題你勾搭

  • 你設置JPanel的邊界 - 它不能改變它的大小,現在多虧了這一點,這可以防止它滾動。
  • 您正在使用一些null佈局和setBounds(...)對任何Swing GUI有危險和有問題的事情,但特別是在嘗試滾動工作時,並且不會增加組件的首選大小(可防止滾動)。

爲了JScrollPanes正常工作,包含組件的大小必須大於JScrollPane的視口,並且在這種情況下不會發生這種情況。

我建議您擺脫空佈局,避免限制滾動JPanel的大小,然後再嘗試一次。

其他問題:

  • 你似乎是在重新閱讀一遍又一遍內的相同圖像環路,東西是浪費和不必要的。在中閱讀一次,使用它創建ImageIcon,並將其存儲在一個變量中。該圖標可以在許多JLabel上重新使用。
  • 您的圖像表明您可能想考慮使用JTable來顯示收集的數據。