【问题标题】:Adding Component to JScrollPane has weird behavior将组件添加到 JScrollPane 有奇怪的行为
【发布时间】:2016-06-10 00:42:56
【问题描述】:

执行此代码会产生非常奇怪的行为。 运行时,尝试调整大小并输入以了解我的意思。

import java.awt.BorderLayout;
import javax.swing.*;

public class FrameWithScrollPanel extends JFrame {
public static void main(String[] args) {
    FrameWithScrollPanel myFrame = new FrameWithScrollPanel();
}


public FrameWithScrollPanel()
{
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    JTextArea textArea1 = new JTextArea(5, 30);
    JTextArea textArea2 = new JTextArea(5, 30);

    JPanel jPanel = new JPanel();
    jPanel.setSize(400,400);
    jPanel.setLayout(new BorderLayout());
    jPanel.add(textArea1, BorderLayout.NORTH);
    jPanel.add(textArea2, BorderLayout.SOUTH);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.add(jPanel);
    getContentPane().add(scrollPane, BorderLayout.CENTER);
    pack();
    setVisible(true);
}
}

现在,替换这两行:

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.add(jPanel);

有了这一行,行为符合预期。

    JScrollPane scrollPane = new JScrollPane(jPanel);

根据文档,JScrollPane 构造函数接受一个组件,add() 也是如此。 为什么会有不同的行为?

【问题讨论】:

    标签: java swing jscrollpane


    【解决方案1】:

    这是错误的:

    scrollPane.add(jPanel);
    

    由于您要使用此添加替换 JScrollPane 的所有重要视口,因此无法正常工作。您应该按照 JScrollPane tutorialJScrollPane API 将其添加到 JScrollPane 的视口中:

    scrollPane.setViewportView(jPanel);
    

    scrollPane.getViewport().add(jPanel);
    

    故事的寓意:如有疑问,请阅读文档。

    请注意,如果将 jPanel 传递给 JScrollPane 的构造函数,

    JScrollPane scrollPane = new JScrollPane(jPanel);
    

    它会自动为您将组件放置到视口中。

    根据 API:

    public JScrollPane(组件视图)
    创建一个显示指定组件内容的 JScrollPane,只要组件的内容大于视图,就会出现水平和垂直滚动条。
    参数:
    view - 在滚动窗格的视口中显示的组件

    【讨论】:

    • 谢谢。实际上,我正在阅读有关 JScrollPane API 的链接,但它只是没有深入了解。由于大多数组件似乎都使用 add() 添加到不同的面板中,因此 JScrollPane 是唯一一个使用 add() 替换视口的唯一组件添加到它?
    • @UnhandledException: JScrollPane 是一个由多个子组件组成的复杂组件,其中一个关键组件(如您所见)是视口。您必须注意的其他组件组件包括顶级窗口,例如 JFrame,它们也由多个组件组成。例如,如果您在 JFrame 上调用 setBackground(Color c),您将看不到背景颜色的变化。要获得想要的效果,您必须调用 JFrame 的 contentPane 上的方法。在 JFrame 上调用 add(Component comp) 时,实际上是在添加到 contentPane。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2012-07-02
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多