Java 将JScrollPane添加到JFrame/JPanel

Java 将JScrollPane添加到JFrame/JPanel,java,swing,jscrollpane,Java,Swing,Jscrollpane,我看了很多问题和网站,但找不到答案。 我有一个JPanel。我想添加一个滚动条,所以我想我应该使用Jscrollpane public class TheFrame extends JFrame { public ThePanel canvas; public TheFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); //------

我看了很多问题和网站,但找不到答案。 我有一个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中。因此,边界是围绕整个应用程序区域的。该面板扩展了JPanel。感谢您的帮助。

将画布添加到滚动,并将滚动添加到
。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);
有几个问题:

  • 创建scrollpane时,canvas变量为null,因为scrollpane中没有添加任何内容

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

  • 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); 
    }
    
    守则的结构应为:

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

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

    谢谢您的回复。好的,我添加了scroll.add(canvas);但这会导致可怕的nullpointerexception…@robertM,
    我添加了scroll.add(canvas)否,您从不将组件直接添加到滚动窗格。您可以将组件添加到scrollpane的视口中,或者使用组件作为参数创建scrollpane,scrollpane将为您将其添加到视口中。您能给我举个例子吗,我对您的意思感到困惑。谢谢。@robertM我加了一个例子。它实际上是这样工作的,没有什么意义。谢谢你的回复。似乎JPanel和JScrollbar仍然是分开的。。。。我需要将画布添加到JscrollBar中。
    我需要将画布添加到JscrollBar中
    -不需要。我给了你需要的密码。当添加到滚动窗格的面板的首选大小大于滚动窗格时,滚动条将自动显示。如果没有向面板添加任何组件,则没有理由显示滚动条。如果正在进行自定义绘制,则需要重写类的
    getPreferredSize()
    方法以返回面板的大小。