JScrollPane不适用于我的JPanel

Pan*_*niz 4 java swing jpanel jframe jscrollpane

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

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();
} 
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*son 14

  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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,作为答案而不是评论更好.虽然,我也会大胆2,因为两者都需要解决问题,另一个是良好的编程实践. (2认同)

Jk1*_*Jk1 5

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

getContentPane().add(scrollPane);
getContentPane().add(panel);
Run Code Online (Sandbox Code Playgroud)

仅限使用

getContentPane().add(scrollPane);
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为scrool窗格是面板的容器,因此在上下文窗格中添加容器就足够了.

  • 请不要使用scrollPane.setPreferredSize(new Dimension(500,500));,因为是放在JFrame.CENTER上,所以很容易被忽略 (2认同)