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
没有出现。 我测试过很多东西。 我已经改变了将panel
和scrollPane
添加到我的frame
但它没有用。 任何人都可以帮助我吗?
- 不要在面板上设置首选尺寸。 请参阅我应该避免在Java Swing中使用setPreferred / Maximum / MinimumSize方法吗? 原因何在。
- 仅将滚动窗格添加到内容窗格。
- 使用默认布局(
BorderLayout
)的内容窗格将默认将组件置于CENTER
约束中(如果未提供),并且CENTER
区域只能接受单个组件。 - 除此之外,该面板已经添加到滚动窗格中,它已经出现在它内部,并且只能出现在一个容器中。
- 使用默认布局(
- 不要扩展框架,只使用一个实例。
- 不要
setSize
,而是setExtendedState
。 - 应在EDT上构建和更新GUI。
- 更好的关闭操作是
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窗格是面板的容器,所以它足以在上下文窗格中添加容器。