4

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

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但它没有用。有人可以帮我吗?

4

2 回答 2

17
  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);
    }
}
于 2013-08-25T17:37:34.737 回答
5

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

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

仅使用

getContentPane().add(scrollPane);

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

于 2013-08-25T17:29:37.467 回答