无法让 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);
    }
}

仅当 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();
         }
      });
   }
}

最新更新