JScrollPane不适用于我的JPanel

首先,我必须说我已经检查了这些问题,但没有找到我的答案:

1,2,3,4,5,6,7

还有很多其他问题

我也检查了这些教程和示例:

1,9,10,11

和许多其他网站。 但我无法解决我的问题。

这是我的代码的简单类型:

public class Question extends JFrame { public Question() { Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); setLayout(new BorderLayout()); setSize(d.width, d.height); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(d.width, d.height)); panel.setBorder(BorderFactory.createLineBorder(Color.red)); panel.setLayout(new BoxLayout(panel, 1)); for (int i = 0; i < 100; i++) { panel.add(new JButton("kjdh")); } JScrollPane scrollPane = new JScrollPane(panel); scrollPane.setPreferredSize(new Dimension(500, 500)); getContentPane().add(scrollPane); getContentPane().add(panel); setVisible(true); } public static void main(String[] args) { new Question(); } } 

但是JScrollPane没有出现。 我测试过很多东西。 我已经改变了将panelscrollPane添加到我的frame但它没有用。 任何人都可以帮助我吗?

  1. 不要在面板上设置首选尺寸。 请参阅我应该避免在Java Swing中使用setPreferred / Maximum / MinimumSize方法吗? 原因何在。
  2. 将滚动窗格添加到内容窗格。
    1. 使用默认布局( BorderLayout )的内容窗格将默认将组件置于CENTER约束中(如果未提供),并且CENTER区域只能接受单个组件。
    2. 除此之外,该面板已经添加到滚动窗格中,它已经出现在它内部,并且只能出现在一个容器中。
  3. 不要扩展框架,只使用一个实例。
  4. 不要setSize ,而是setExtendedState
  5. 应在EDT上构建和更新GUI。
  6. 更好的关闭操作是DISPOSE_ON_CLOSE

 import java.awt.*; import javax.swing.*; public class Question { public Question() { JFrame f = new JFrame(); f.setLayout(new BorderLayout()); f.setResizable(false); f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.red)); panel.setLayout(new BoxLayout(panel, 1)); for (int i = 0; i < 100; i++) { panel.add(new JButton("kjdh")); } JScrollPane scrollPane = new JScrollPane(panel); f.getContentPane().add(scrollPane); f.pack(); f.setExtendedState(JFrame.MAXIMIZED_BOTH); f.setVisible(true); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { new Question(); } }; SwingUtilities.invokeLater(r); } } 

您在上下文窗格中添加了一个不必要的重复面板。 代替:

 getContentPane().add(scrollPane); getContentPane().add(panel); 

仅限使用

 getContentPane().add(scrollPane); 

它是有道理的,因为scrool窗格是面板的容器,所以它足以在上下文窗格中添加容器。