JScrollPane不适用于我的JPanel

时间:2013-08-25 17:24:43

标签: java swing jframe jpanel jscrollpane

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

1234567

和许多其他问题一样

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

191011

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

和 这是我的简单代码:

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的方式,但它没有用。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:14)

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

  7. 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);
        }
    }
    

答案 1 :(得分:5)

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

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

仅使用

getContentPane().add(scrollPane);

因为scrool窗格是面板的容器所以有意义,因此在上下文窗格中添加容器就足够了。