2012-06-13 18 views
5

पर इसका उपयोग करते समय प्रकट नहीं होता है, मैं इस मुद्दे को हल करने के लिए एक रास्ता खोजने के लिए घंटों तक प्रयास कर रहा हूं, लेकिन मुझे इसके साथ कोई भाग्य नहीं था। यहां एक नमूना कोड है:JSCrollPane किसी JPanel

import java.awt.BorderLayout; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class Example extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public Example() 
    { 
     JPanel contentPane = (JPanel) getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     JPanel panTop = new JPanel(new BorderLayout()); 
     //JPanel panBottom = new JPanel(new BorderLayout()); 

     JPanel panTopCenter = new JPanel(); 
     //JPanel panTopLeft = new JPanel(); 
     //JPanel panTopRight = new JPanel(); 

     panTop.add(panTopCenter, BorderLayout.CENTER); 
     //panTop.add(panTopLeft, BorderLayout.WEST); 
     //panTop.add(panTopRight, BorderLayout.EAST); 

     contentPane.add(panTop, BorderLayout.CENTER); 
     //contentPane.add(panBottom, BorderLayout.SOUTH); 

     JPanel pan = new JPanel(); 
     pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); 
     for(int i = 0; i < 50; i++) pan.add(new JButton("Button " + i)); 
     JScrollPane scrollPane = new JScrollPane(pan); 
     panTopCenter.add(scrollPane); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     {   
      @Override 
      public void run() 
      { 
       new Example(); 
      } 
     }); 
    } 
} 

स्नैपशॉट:

enter image description here

+0

'BoxLayout' का उपयोग करने के बजाय, 'ग्रिडलाउट' का प्रयास करें, जैसा कि इस [उदाहरण] में दिखाया गया है (http://stackoverflow.com/questions/10331129/jscrollpane-resize-containing-jpanel-when-scrollbars-appear/ 10333957 # 10333957), चूंकि 'ग्रिडलाउट' में सभी 'जेबटन' बराबर आकार के होंगे, 'बॉक्सलेआउट' के विपरीत, जहां आकार इसके अंदर के पाठ द्वारा निर्धारित किया जाता है। –

उत्तर

7

मुझे हमेशा इस तरह के व्यूपोर्ट के पसंदीदा आकार को सेट करना होगा।

import java.awt.*; 
import javax.swing.*; 

public class Example extends JFrame { 

    public Example() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     Box box = new Box(BoxLayout.Y_AXIS); 
     for (int i = 0; i < 50; i++) { 
      box.add(new JButton("Button " + i)); 
     } 
     JScrollPane sp = new JScrollPane(box); 
     Dimension d = new Dimension(box.getComponent(0).getPreferredSize()); 
     sp.getVerticalScrollBar().setUnitIncrement(d.height); 
     d.height *= 10; // Show at least 10 buttons 
     sp.getViewport().setPreferredSize(d); 

     add(sp, BorderLayout.CENTER); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       Example e = new Example(); 
      } 
     }); 
    } 
} 
+2

आप 'स्क्रॉल करने योग्य' भी लागू कर सकते हैं। – trashgod

3

आप मामले में वरीय आकार निर्धारित करने के लिए, है कि JScrollPane कंटेनर या शीर्ष-स्तर में एकल JComponent है कंटेनर।

scrollPane.setPreferredSize(new Dimension(100,500)); 

बेहतर JComponent रों के एक ही प्रकार के लिए GridLayout उपयोग करने के लिए किया जाएगा।

+0

लेकिन जब मैं ऐसा करता हूं, तो 'पैनटॉपेंटर' का स्थिर आकार होगा और जेएफआरएएम आकार को बढ़ाने पर गतिशील रूप से विस्तार नहीं होगा। –

+0

[तो यह सही तरीका हो सकता है] (http://stackoverflow.com/a/5760093/714968) – mKorbel

+0

मुझे लगता है कि आप व्यूपोर्ट के आकार को बदल सकते हैं जैसे [यहां] (http://stackoverflow.com/a/11016543/ 261,156)। –

7

किसी भी आकार निर्धारित न करें! यदि यह परिवर्तन किया जाता है तो स्क्रॉल-बार प्रकट होता है।

JPanel panTopCenter = new JPanel(new GridLayout()); 

बुनियादी समस्या यह है कि FlowLayout सबसे छोटा आकार इसे प्रदर्शित करने के लिए आवश्यक में घटकों दिखाएगा है, और एक स्क्रॉल फलक के लिए, कि (होने का फैसला किया) 0x0 है। GridLayout का उपयोग करके कन्स्ट्रक्टर में कोई तर्क नहीं है और स्क्रॉल-फलक को एकमात्र घटक के रूप में जोड़कर, इसे उपलब्ध स्थान भरने के लिए मजबूर किया जाएगा।

+1

+1 IIUC, समस्या यह है कि परिणामस्वरूप व्यूपोर्ट पसंदीदा आकार अनावश्यक है और (संभवतः) एल एंड एफ निर्भर है। मैं 'getPreferredScrollableViewportSize()' को लागू करने का समर्थन करता हूं। – trashgod

+0

@trashgod मैं उन स्थितियों को देख सकता हूं जहां एक पसंदीदा दृश्य पोर्ट आकार की आवश्यकता हो सकती है, लेकिन हमेशा 'सेट ** किसी ** आकार' के बारे में बहुत सतर्क रहती है। यह कुछ ऐसा है जो मैं केवल अन्य संभावित संभावनाओं को समाप्त करने के बाद देखता हूं। –

+0

@ बॉथ मैं मानता हूं, मुझे सही प्रश्न के लिए यह प्रश्न +1 बहुत अच्छी तरह से समझ में नहीं आता है – mKorbel

0

सबसे अच्छा समाधान, जल्दी और आसानी से, SwingX, जो अर्ध मानक है और Scrollable लागू करता है से JXPanel उपयोग कर रहा है।