Java 滚动条未出现在 JScrollPane 中

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6641897/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 08:32:17  来源:igfitidea点击:

Scrollbars not appearing in JScrollPane

javaswingjscrollpane

提问by Damjan

I want to make a window with two buttons with great heights and a scrollbar on a side. The problem is that no scrollbar appears. Here is my code

我想制作一个带有两个高度很高的按钮和一个侧面滚动条的窗口。问题是没有出现滚动条。这是我的代码

public class Window {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    //namestanje teme
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    JFrame frame = new JFrame("frame");
//  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel(null);

    JButton but1 = new JButton();
    JButton but2 = new JButton();

    panel.add(but1);
    panel.add(but2);

    but1.setSize(50, 505);
    but2.setSize(50, 505);

    but1.setLocation(0, 0);
    but2.setLocation(400, 400);

    but1.setText("1");
    but2.setText("2");


    JScrollPane scroll = new JScrollPane(panel);

    frame.add(scroll);
    frame.setVisible(true);         
}
}

Note: At first, the buttons had large widths (did that by naming them with something like "11111111111111111111111111111") and a scrollbar would appear. Then I wanted large heights and had to put null in panel. Now no scrollbar appears.

注意:起初,按钮的宽度很大(通过将它们命名为“11111111111111111111111111111”)并且会出现一个滚动条。然后我想要大高度并且不得不在面板中放置 null 。现在没有滚动条出现。

回答by camickr

Scrollbars appear when the preferred size of the component added to the scollpane is greater than the size of the scrollpane.

当添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,会出现滚动条。

It is the job of the layout manager to determine the preferred size of the panel. It is also the job of the layout manager to determine the size and location of the components added to the panel.

确定面板的首选大小是布局管理器的工作。确定添加到面板的组件的大小和位置也是布局管理器的工作。

Get rid of the null layout and use a layout manager and scrollbars will appear when required automatically.

摆脱空布局并使用布局管理器,滚动条将在需要时自动出现。

If you want components to be displayed differently from a vertical point of view, then you need to use a different layout manager. Maybe you can use a BoxLayoutwith a verticxal layout. You can use:

如果您希望组件从垂直角度以不同的方式显示,那么您需要使用不同的布局管理器。也许您可以使用带有垂直布局的BoxLayout。您可以使用:

panel.add( Box.createVerticalStrut(400) );

to add vertical space between the two components.

在两个组件之间添加垂直空间。

回答by Eng.Fouad

To make the scrollbar always appear, use:

要使滚动条始终出现,请使用:

yourScrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

...

...

import javax.swing.*;
import java.awt.*;
public class Window {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //namestanje teme
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        JFrame frame = new JFrame("frame");
    //  frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setPreferredSize(new Dimension(100,95));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();

        JButton but1 = new JButton();
        JButton but2 = new JButton();

        panel.add(but1);
        panel.add(but2);

        but1.setSize(50, 505);
        but2.setSize(50, 505);

        but1.setLocation(0, 0);
        but2.setLocation(400, 400);

        but1.setText("1");
        but2.setText("2");


        JScrollPane scroll = new JScrollPane(panel);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        frame.setLayout(new FlowLayout());
        frame.pack();
        frame.add(scroll);
        frame.setVisible(true);         
    }

}