当前位置: 首页 > 知识库问答 >
问题:

Java Swing滚动窗格不滚动

后阳炎
2023-03-14

我希望能够向下滚动动态生成的电影列表。我尝试添加滚动窗格。

我在页面的开头有一个导航栏,中间有一个包含所有电影的jpanel。

您可以使用以下代码重新创建此示例:

private static JFrame frame;

public static void main(String[] args) throws HeadlessException {
    frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.setBackground(new Color(32, 32, 32));
    
    JPanel navigationPanel = createNavigationBar();
    frame.add(navigationPanel, BorderLayout.PAGE_START);
    
    JPanel moviePanel = createMoviePanel();
    frame.add(moviePanel, BorderLayout.CENTER);
    
    frame.setPreferredSize(new Dimension(1920, 1080));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Example App");
    frame.pack();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);
}

// MoviePanel Class
public static JPanel createMoviePanel() {
    JPanel parentMoviePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 25));
    JPanel contentPanel = new JPanel(new GridLayout(0, 1));
    JPanel moviePanel = new JPanel(new GridLayout(0, 9, 8, 5));
    
    JScrollPane scrollPane = new JScrollPane(moviePanel);
    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(0, 0));
    scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0));
    
    parentMoviePanel.setBackground(new Color(32, 32, 32));
    contentPanel.setBackground(new Color(32, 32, 32));
    moviePanel.setBackground(new Color(32, 32, 32));

    final File root = new File("");

    for (int i = 0; i < 70; i++) {
        // Get the image and scale it down
        BufferedImage movieCover=new BufferedImage(150,200,BufferedImage.TYPE_INT_RGB); 
           Graphics2D g2d=(Graphics2D)movieCover.getGraphics();  
           g2d.setColor(Color.GRAY);  
           g2d.fillRect(0,0,movieCover.getWidth(),movieCover.getHeight());

        // Create button and change settings
        JButton movieButton = new JButton("Movie " + i, new ImageIcon(movieCover));
        movieButton.setMargin(new Insets(0, 0, 0, 0));
        movieButton.setPreferredSize(new Dimension(180, 250));
        movieButton.setForeground(Color.WHITE);
        movieButton.setContentAreaFilled(false);
        movieButton.setBorderPainted(false);
        movieButton.setFocusPainted(false);
        movieButton.setHorizontalTextPosition(JButton.CENTER);
        movieButton.setVerticalTextPosition(JButton.BOTTOM);

        moviePanel.add(movieButton);
        scrollPane.revalidate();
    }
    
    contentPanel.add(moviePanel);
    contentPanel.add(scrollPane);
    parentMoviePanel.add(contentPanel);
    
    return parentMoviePanel;
}

// Navbar Class
public static JPanel createNavigationBar() {
    JPanel navBar = new JPanel();
    navBar.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 20));
    navBar.setBackground(new Color(25, 25, 25));
    
    JButton homeButton = new JButton("Home");
    homeButton.setContentAreaFilled(false);
    homeButton.setBorderPainted(false);
    homeButton.setFocusPainted(false);
    
    JButton movieButton = new JButton("Movies");
    movieButton.setContentAreaFilled(false);
    movieButton.setBorderPainted(false);
    movieButton.setFocusPainted(false);
    
    // Add all the buttons to the navbar
    navBar.add(homeButton);
    navBar.add(movieButton);
    
    return navBar;
}

我想做的是用我的鼠标滚轮向下滚动这个电影列表,而不看任何滚动条。它现在看起来应该和现在一模一样,但我希望能够向下滚动,看到所有的电影。

我不知道为什么它不起作用,这就是为什么我在这里问,希望有人能向我解释我做错了什么。

共有1个答案

卜季萌
2023-03-14

您对滚动窗格的使用不正确。

Swing组件只能有一个父组件。下面的代码正在创建带有子组件的滚动窗格。但是,当您将moviePanel添加到内容窗格时,可以从滚动窗格中删除它。

所以滚动窗格没有子组件,永远不会工作。

JScrollPane scrollPane = new JScrollPane(moviePanel);
...    
contentPanel.add(moviePanel);
contentPanel.add(scrollPane);

然而,即使这样也不能解决你的问题,因为你现在在你的顶层面板上使用一个FlowLayout,所以所有的子组件将始终显示在它们的首选大小,所以不需要滚动条。

去掉createMoviePanel()方法中的所有滚动窗格逻辑。

相反,您可能希望将滚动窗格添加到内容窗格:

//frame.add(moviePanel, BorderLayout.CENTER);
frame.add(new JScrollPane(moviePanel), BorderLayout.CENTER);

现在滚动窗格将随着帧大小的变化而动态调整大小。滚动条将根据需要显示。

 类似资料:
  • 问题我如何可以嵌入这个应用程序到SPlitPane,在左边将是另一个面板。 不幸的是,代码导致了错误的坐标,

  • 基于此注释https://stackoverflow.com/a/29530135/1387524,我添加了一个ScrollPane,以便在画布移到可见区域之外时使用滚动。

  • 我正在尝试获取一些关于组件的信息,这些组件按标准包含在中。特别是我对阅读水平的感兴趣。我怎么参考?

  • 问题内容: 当内容的高度增加时,有什么方法可以自动向下滚动ScrollPane控件?例如,我在屏幕底部(在ScrollPane内部)有一个TitledPane,当我展开它时,我希望ScrollPane向下滚动,以便可以看到TitledPane的全部内容。 问题答案: 您可以结合使用和和来实现该行为 第一个是获取titlePane的坐标,第二个是设置scrollPane的垂直栏位置。请注意,它的范围

  • 我试图将乘法VBox添加到scrollpane中的gridpane(在下面的codesnippet中称为refPane)。 它在一行中添加不超过ITEMS_PER_ROW的Vbox,并在下一行中继续。也不应该有更多的行,然后ITEMS_PER_COLUM可见。问题是,如果我添加更多的ITEMS_PER_ROW*ITEMS_PER_COLUMN到网格中,而不是obingbeingscrollable

  • 哟伙计们。我需要关于如何最好地实现某些东西的建议。我的程序: 我有一个swing程序,可以读取具有多个不同类型的记录的文件。我将这些记录读入java对象中,用它们的标题和内容制作JTables(所以每个表只有标题和1条记录),将这些表添加到面板中,然后将面板添加到滚动窗格中。有很多记录,大约70000,所以我不能一次将所有内容加载到内存中。 我的计划是通过一次只显示100条记录来对显示进行分页,如