【问题标题】:Scrollbars not appearing in JScrollPane滚动条没有出现在 JScrollPane 中
【发布时间】:2011-10-02 06:48:03
【问题描述】:

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

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);         
}
}

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

【问题讨论】:

  • 为什么要使用 Null 布局?此外,您应该调用setPreferredSize(...),而不是setSize(...)。你的目标是什么?
  • 设置 Nimbus PLAF 的 16 行 真的 是演示问题所必需的吗?在讨论这个主题时,请考虑在未来发布SSCCE

标签: java swing jscrollpane


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    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);         
        }
    
    }
    

    【讨论】:

    • 它可能会出现,但不会起作用。你不应该使用 setSize() 和 setLocation()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多