簡體   English   中英

Java Swing 滾動窗格不滾動

[英]Java Swing Scrollpane not scrolling

我希望能夠向下滾動動態生成的電影列表。 我嘗試添加一個滾動窗格。

我的應用程序看起來如何

我在頁面開始處有一個導航欄,在中心有一個包含所有電影的 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;
}

我想要做的是使用我的鼠標滾輪向下滾動這個電影列表,而不會看到任何類型的滾動條。 它看起來應該和現在的樣子一模一樣,但我希望能夠向下滾動並查看所有電影。

我不知道為什么它不起作用,這就是為什么我在這里問,希望有人能向我解釋我做錯了什么。

您對滾動窗格的使用不正確。

一個 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);

現在,滾動窗格將隨着框架大小的變化而動態調整大小。 然后將根據需要顯示滾動條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM