2016-12-15 48 views
2

我正在爲我的大學項目創建GUI,我正試圖瞭解JScrollPane的工作原理。如何讓JPanel可滾動?

我已經成功地編寫簡單的程序,這表明在可滾動的方式圖片:

public class ScrollPaneTest{ 
    public static void main(String[] args){ 
     JFrame testFrame = new JFrame("ramka testowa"); 
     testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG")); 
     JScrollPane scrollPane = new JScrollPane(picture); 

     testFrame.add(scrollPane, BorderLayout.CENTER); 
     testFrame.setSize(400, 400); 
     testFrame.setVisible(true); 
    } 
} 

雖然,在我最後的GUI,我想申請JScrollPane既來之,例如一部分單個JPanel。爲了驗證這一想法,我寫了下面的代碼,不幸的是不起作用:

public class ScrollPaneTest{ 
    public static void main(String[] args){ 
     JFrame testFrame = new JFrame("ramka testowa"); 
     testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel picture = new JLabel(new ImageIcon("JavaSwingCompoentsList.PNG")); 
     JScrollPane scrollPane = new JScrollPane(picture); 

     JPanel insidePanel = new JPanel(); 
     insidePanel.add(scrollPane); 
     testFrame.add(insidePanel, BorderLayout.CENTER); 

     testFrame.setSize(400, 400); 
     testFrame.setVisible(true); 

    } 
} 

我讀過許多教程,以及堆棧和CodeRanch文章,我仍然不能掌握如何JScrollPane工作的想法。我懷疑,是我的失誤是與指定JPanel -to-滾動的尺寸,但是每一個方法我都試過給了我沒有滾動條或無圖像的。

如果你能告訴我正確的解決這個問題,最重要的是,告訴我在哪裏,我錯了,我會非常感激。

+0

TEZ jestem Polakiem :) –

回答

3
  1. 初始化JPanel,與畫面不JScrollPane
  2. 要添加JPanelJScrollPane,做到:

    scrollPane.setViewportView (panel) 
    
  3. 添加JScrollPane,不JPanelJFrame

2

最簡單的方法是創建您的JPanel並創建JScrollPane的時候指定:

JPanel myPanel = ...; 
JScrollPane scroller = new JScrollPane(myPanel); 

然後,只需添加滾動到你的GUI(而不是添加myPanel)。

2

該問題似乎來自內部面板的默認FlowLayout。更改爲另一種佈局(我使用BordeLayout),它應該工作。話雖如此,我無法解釋爲什麼流程佈局失敗!

import java.awt.BorderLayout; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class ScrollPaneTest { 

    public static void main(String[] args) { 
     JFrame testFrame = new JFrame("ramka testowa"); 
     testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel picture = new JLabel(new ImageIcon(
       new BufferedImage(370, 1200, BufferedImage.TYPE_INT_RGB))); 
     JScrollPane scrollPane = new JScrollPane(picture); 

     JPanel insidePanel = new JPanel(new BorderLayout()); 
     insidePanel.add(scrollPane); 
     testFrame.add(insidePanel, BorderLayout.CENTER); 

     insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_START); 
     insidePanel.add(new JLabel("Stay"), BorderLayout.LINE_END); 
     insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_START); 
     insidePanel.add(new JLabel("Stay"), BorderLayout.PAGE_END); 

     testFrame.pack(); 

     testFrame.setSize(400, 400); 
     // failing to do this will end the main & the app. 
     // doing it will cause the EDT to start. 
     testFrame.setVisible(true); 
    } 
}