4

请查看下面的小代码。出现滚动窗格,但不显示滑块。即使我调整框架的大小,滑块也不会。请帮忙。

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

1 回答 1

4

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

顺便说一句,您几乎不应该使用空布局。

例如:

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();
         }
      });
   }
}
于 2012-12-08T02:32:58.890 回答