【问题标题】:Why oh why, does my scrollPane not scroll to anywhere?为什么哦为什么,我的 scrollPane 不能滚动到任何地方?
【发布时间】:2020-11-20 20:36:32
【问题描述】:

我不明白为什么这段代码不显示滚动条。我是 Swing 的初学者,所以滚动窗格非常混乱,我不明白我在网上看到的一些解决方案。烦人的事情是这段代码短暂工作,但我在尝试添加组件时在备份之前破坏了成功的部分。任何帮助将不胜感激!

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

public class Test extends JFrame
{
    private JPanel leftPanel;
    private JButton myButton;
    private JPanel scrollPanel;
    private JScrollPane scrollPane;
    
    public static void main(String[] args)
    {
        System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() {
                new Test();
            }
        });
    }
    
    /**
     * Constructor for objects of class Backup
     */
    public Test()
    {
        this.setTitle("testy");
        this.setSize(new Dimension(1280,622));
        
        leftPanel = new JPanel();
        leftPanel.setBackground(new Color(255,0,0));
        leftPanel.setBounds(0, 100, 640, 558);
        leftPanel.setEnabled(true);
        this.add(leftPanel);
        
        scrollPanel = new JPanel(null);
        scrollPanel.setBackground(new Color(100,100,100));
        scrollPanel.setPreferredSize(new Dimension(640, 550));
        scrollPanel.setEnabled(true);
        
        JScrollPane scrollPane = new JScrollPane(scrollPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBounds(0, 0, 642, 550);
        scrollPane.setEnabled(true);
        leftPanel.add(scrollPane);
        
        for (int i = 1; i < 30; i++) 
        {
            scrollPanel.setLayout(new GridLayout(30, 1, 0, 1));
            myButton = new JButton("AAAAAAAAAAAAAAAAAAAAA " + i);
            myButton.setPreferredSize(new Dimension(630, 70));
            scrollPanel.add(myButton);
        }
        
        this.setBackground(new Color(0,0,0));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
}
}

我想从那以后我已经大大改进了它,这要感谢 camickr 这是当前版本:

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

    public class Test extends JFrame
    {
    private JPanel leftPanel;
    private JButton myButton;
    private JPanel scrollPanel;
    private JScrollPane scrollPane;

    public static void main(String[] args)
    {
    System.setProperty("swing.defaultlaf", 
    "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
        public void run() {
            new Test();
        }
    });
    }


    public Test()
    {
    this.setTitle("testy");
    this.setSize(new Dimension(1280,622));
    
    leftPanel = new JPanel();
    leftPanel.setBackground(new Color(255,0,0));
    leftPanel.setBounds(0, 100, 640, 558);
    this.add(leftPanel);
    
    scrollPanel = new JPanel();
    scrollPanel.setLayout(new GridLayout(70, 1, 0, 1));
    //scrollPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 
    20));
    scrollPanel.setBackground(new Color(100,100,100));
    //scrollPanel.setPreferredSize(new Dimension(640, 550));
    
    //JScrollPane scrollPane = new JScrollPane(scrollPanel);
    JScrollPane scrollPane = new JScrollPane(scrollPanel, 
    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    //scrollPane.setLayout(new GridLayout(30, 1, 0, 1));
    //scrollPane.setBounds(0, 0, 642, 550);
    scrollPane.setEnabled(true);
    //scrollPanel.add(scrollPane);
    
    leftPanel.add(scrollPanel);

    for (int i = 1; i < 71; i++) 
    {
        myButton = new JButton("AAAAAAAAAAAAAAAAAAAAA " + i);
        //myButton.setPreferredSize(new Dimension(640, 80));
        scrollPanel.add(myButton);
    }
    
    this.setBackground(new Color(0,0,0));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.pack();
    this.setVisible(true);
    }}

【问题讨论】:

    标签: java swing jscrollpane grid-layout


    【解决方案1】:
    1. 不要使用空布局。

    2. 不要使用 setBounds()。

    3. 不要使用 setPreferredSize()。

    每个 Swing 组件负责确定自己的首选大小。然后布局管理器将设置添加到面板的每个组件的大小/位置,然后(动态)计算面板的首选大小。当面板的首选大小大于滚动窗格的大小时,将出现滚动条。

        scrollPanel = new JPanel(null);
        scrollPanel.setBackground(new Color(100,100,100));
        // scrollPanel.setPreferredSize(new Dimension(640, 550)); // delete
        //scrollPanel.setEnabled(true); // not needed
        ...
    
        for (int i = 1; i < 30; i++) 
        {
            //scrollPanel.setLayout(new GridLayout(30, 1, 0, 1)); // set layout when panel created.
            //myButton.setPreferredSize(new Dimension(630, 70)); // not needed.
    
    1. 当您创建面板时,布局管理器应该设置在循环之外。它不应该为空。

    2. 不要硬编码首选尺寸。它不会随着组件的添加而动态调整。

    3. Swing 组件默认启用,不需要 setEnabled。

    4. 不要使用“leftPanel”。只需将滚动窗格直接添加到框架中即可。这将允许滚动窗格在调整框架大小时动态调整大小。然后滚动条会在需要时出现。

    5. 不要设置按钮的首选大小。大小将根据按钮的文本和字体确定。

    【讨论】:

    • 好的,我把布局管理器拿出来,删除了所有与大小相关的元素(除了左面板),别以为我可以剪掉左面板,因为我把这个 sn-p 从框架中剪下来了右侧和顶部面板,我删除了 setEnabled 和 null 布局。尽管没有创建滚动窗格,但这些按钮似乎正在缩小自己。无论出于何种原因,将滚动窗格直接添加到左侧面板都不会出现任何内容,尽管添加了数百个当前仍在屏幕外的按钮,但我永远无法滚动到它们。
    • @Tomato,在第 4 点中我特别指出 1)不要使用“leftPanel”和 2)将滚动窗格直接添加到框架中。
    猜你喜欢
    • 2021-01-24
    • 2020-07-22
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多