【问题标题】:Adding JScrollPane to JFrame/JPanel将 JScrollPane 添加到 JFrame/JPanel
【发布时间】:2015-05-01 00:55:36
【问题描述】:

我查看了很多问题和网站,但找不到答案。 我有一个JPanel。我想添加一个滚动条,所以我想我会使用 Jscrollpane。

public class TheFrame extends JFrame {

public ThePanel canvas;


public TheFrame() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    setLayout(new BorderLayout());


   //-------------------------------------

    JScrollPane scroll = new JScrollPane(canvas);
    scroll.setViewportBorder(new LineBorder(Color.RED));
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    add(scroll, BorderLayout.SOUTH);

   //-------------------------------------------------


    canvas = new ThePanel();

    setSize(700, 400);

    this.add(canvas, BorderLayout.CENTER);

    setVisible(true); 
}

目前,卷轴刚刚出现在底部。边框显示它只是底部的一小块区域。我正在尝试将 Jpanel 放入 Jscrollpane。所以边界是围绕整个应用程序区域。 ThePanel 扩展了 JPanel。感谢您的帮助。

【问题讨论】:

    标签: java swing jscrollpane


    【解决方案1】:
    JScrollPane scroll = new JScrollPane(canvas);
    add(scroll, BorderLayout.SOUTH);
    canvas = new ThePanel();
    this.add(canvas, BorderLayout.CENTER);
    

    几个问题:

    1. 创建滚动窗格时,canvas 变量为空,滚动窗格中没有添加任何内容

    2. 一个组件只能有一个父组件,因此当您将画布添加到“CENTER”时,您可以将其从滚动窗格中移除。

    代码的结构应该是:

    canvas = new ThePanel();
    JScrollPane scrollPane = new JScrollPane( canvas );
    add(scrollPane, BorderLayout.CENTER);
    setVisible( true );
    

    也就是说,您将画布添加到滚动窗格,并将滚动窗格添加到框架。

    【讨论】:

    • 感谢您的回复。 JPanel 和 JScrollbar 似乎仍然是分开的......我需要将画布添加到 JscrollBar 中。
    • I need to add the canvas into the JscrollBar - 不,你没有。我给了你你需要的代码。当您添加到滚动窗格的面板的首选大小大于滚动窗格时,滚动条将自动出现。如果您不向面板添加任何组件,则没有理由出现滚动条。如果你正在做自定义绘画,那么你需要重写你的类的getPreferredSize() 方法来返回面板的大小。
    【解决方案2】:

    将画布添加到滚动,并将滚动添加到this。 JScrollPane 包装了组件,它不会神奇地将自己添加到组件中。

    例子:

    JFrame frame = new JFrame();
    JPanel pane = new JPanel();
    JScrollPane scroller = new JScrollPane(pane);
    frame.add(BorderLayout.CENTER, scroller);
    scroller.setWheelScrollingEnabled(true);
    scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    frame.setVisible(true);
    

    【讨论】:

    • 感谢您的回复。好的,我添加了 scroll.add(canvas);但这会导致可怕的 nullpointerexception....
    • @robertM, I added scroll.add(canvas); 不,您永远不会将组件直接添加到滚动窗格中。您将组件添加到滚动窗格的视口中,或者以组件作为参数创建滚动窗格,滚动窗格会为您将其添加到视口中。
    • 你能给我举个例子吗,我对你的意思感到困惑。谢谢。
    • @robertM 我添加了一个示例。它实际上是按原样工作的,但它并没有多大意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多