2012-12-08 59 views
4

请查看下面的小代码。滚动窗格出现,但滑块不。 即使我调整框架滑块不。请帮忙。无法让JScrollPane在JFrame上工作

import javax.swing.*; 
public class sample { 
    static JFrame frame; 
    public static void main(String[] args) { 
     String Msg = "Sample Message To Test Scrolling"; 
     frame = new JFrame("Sample Program"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 
     JPanel panel = new JPanel(); 
     panel.setLayout(null); 

     for (int ypos = 0, i = 0; i < 40; i++) { 
      JLabel label = new JLabel("" + i + " " + Msg); 
      label.setFont(new Font("Courier", Font.BOLD, 12)); 
      panel.add(label); 
      label.setBounds(10, ypos + 5, 
          label.getPreferredSize().width, 
          label.getPreferredSize().height); 
      ypos += label.getPreferredSize().height; 
     } 
     JScrollPane scroll = new JScrollPane(panel, 
           JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
           JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     frame.setLayout(new BorderLayput()); 
     frame.add(scroll); 
     frame.setVisible(true); 
    } 
} 

回答

4

只有当JScrollPane的视口包含的组件大于视口时,才会出现滑块。根据您发布的代码,我不明白为什么您的组件会比视口大,因为面板的大小将基于其preferredSize,这是永远不会改变的,因为一方面,您正在使用它添加组件一个空的布局。

另外,你几乎不应该使用null布局。

例如:

import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class Sample2 { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final int MAX_ROWS = 400; 
    private static final String TEXT_BODY = "Sample Message To Test Scrolling";; 

    private static void createAndShowGui() { 
     JPanel panel = new JPanel(new GridLayout(0, 1)); 
     panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     for (int i = 0; i < MAX_ROWS; i++) { 
     String text = String.format("%03d %s", i, TEXT_BODY); 
     JLabel label = new JLabel(text); 
     panel.add(label); 
     } 

     JScrollPane scrollPane = new JScrollPane(panel); 
     scrollPane.setPreferredSize(new Dimension(PREF_W, PREF_H)); 

     JFrame frame = new JFrame("Sample2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(scrollPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

大先生。有效。感谢你的帮助。 – Manu