2016-06-14 32 views
0

我有一些問題需要滾動JPanel組件......我花了3個多小時才完成這項工作,但沒有成功,這就是爲什麼我要求你的幫助!使用GridBagLayout製作可滾動的JPanel子節點

Window類:

public class Window extends JFrame { 
    public Window(String title) { 
     super(); 

     Dimension dimension = IHM.getDimension(); 

     this.setTitle(title); 
     this.setSize(dimension.width, dimension.height); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     this.setMaximumSize(dimension); 
     this.setMinimumSize(dimension); 
     this.setContentPane(new Container()); 
     this.setBackground(IHM.getBlue()); 
     this.pack(); 
     this.setVisible(true); 
    } 
} 

容器類:

public class Container extends JPanel { 
    public static Boolean debug = true; 
    private Dimension lastDimension = new Dimension(0, 0); 

    public Container() { 
     // Layout 
     GridBagLayout layout = new GridBagLayout(); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     // Panel configurations 
     this.setLayout(layout); 

     /** 
     * HEADER 
     */ 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     gbc.gridheight = 1; 

     this.add(new HeaderPanel(), gbc); 

     /** 
     * LEFT 
     */ 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.gridwidth = 1; 
     gbc.fill = GridBagConstraints.BOTH; 

     JPanel leftPanel = new LeftPanel(); 

     JScrollPane leftPanelScrollable = new JScrollPane(leftPanel); 

     leftPanelScrollable.setViewportView(leftPanel); 
     leftPanelScrollable.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     leftPanelScrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     leftPanelScrollable.setBounds(10, 10, leftPanel.getWidth() - 50, leftPanel.getHeight() - 50); 

     this.add(leftPanelScrollable, gbc); 

     // ... 
    } 
} 

而且leftPanel類:

public class LeftPanel extends JPanel { 
    private static Dimension dimension = new Dimension(IHM.getWidth()/2, IHM.getHeight() - 220); 

    public LeftPanel() { 
     this.setPreferredSize(dimension); 

     // Add the labels 
     this.addLabel(); 

     // Add the radios 
     this.addRadios(); 

     this.setAutoscrolls(true); 
    } 
} 

請看截圖,我沒有任何滾動條:(

的結果在圖片:

http://i.stack.imgur.com/q40Ct.png

你有關於這個問題的任何想法?提前致謝!

+0

請考慮告訴我們更多關於您可能遇到的問題。 –

+0

請注意,我們更願意查看有關代碼和問題的詳細信息,然後查看您在此過程中花費了多少小時。 –

+0

@HovercraftFullOfEels:我添加了一個截圖。關於細節,所有重要的代碼都是關於addLabels和addRadios方法的介紹,我不認爲這很重要,如果我錯了,請糾正。 – keupsonite

回答

-1

消除對每個JPanel中定義的大小和首選大小之後,經過設定的GridBagConstraints weightyweightxfillGridBagConstraints.BOTH最後使用setBoxLayout(new BoxLayout(this, BoxLayout.Y_AXIS))我leftPanel,一切正常!無論如何感謝所有人。

Final result

2
leftPanelScrollable.setBounds(10, 10, leftPanel.getWidth(), leftPanel.getHeight()); 

這應該會造成傷害。上述方法強制JScrollPane與底層面板的大小相同。讓佈局經理完成這項工作。

P.S.我沒有測試過它。


你也應該嘗試讓你的JPanel實施Scrollable並設置

public boolean getScrollableTracksViewportHeight() 

而且

public boolean getScrollableTracksViewportWidth() 

返回FALSE。

+0

我嘗試更多的高度和寬度,沒有setBounds調用,但這沒有什麼區別,這就是爲什麼我讓原來的大小。對不起,我會立即更新我的帖子關於更多的寬度和高度的大小,以避免混淆。謝謝你的時間。 – keupsonite

+1

用較小的寬度和高度嘗試......這將激活滾動。 – Mordechai

+0

我試過setBounds或多或少的高度和寬度,但結果是一樣的。無論如何謝謝 – keupsonite

2
this.setPreferredSize(dimension); 

請勿手動設置首選尺寸。該小組的佈局管理員將確定首選大小。 JPanel的默認佈局管理器是FlowLayout,它會給出一個首選大小,好像所有組件都在同一行上,這顯然不是你想要的,所以使用不同的佈局管理器。

this.setAutoscrolls(true); 

這不是滾動所必需的。

JScrollPane leftPanelScrollable = new JScrollPane(leftPanel); 
    leftPanelScrollable.setViewportView(leftPanel); 

沒有必要設置視口視圖。當您創建滾動窗格時,您指定的組件將被添加到視口中。

leftPanelScrollable.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    leftPanelScrollable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

沒有必要設置滾動條策略。滾動條會在需要時自動顯示(一旦你獲得代碼的工作)並讓佈局管理員完成他們的工作。

GridBagLayout layout = new GridBagLayout(); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    this.setLayout(layout); 

我建議你可以使用更容易使用的BorderLayout。只需將「headerPanel」添加到BorderLayout.PAGE_START即可。然後將您的「leftPane」添加到BorderLayout.CENTER。然後,在調整框架大小時,所有額外的空間將轉至CENTER,滾動條將根據需要顯示。

所有重要的代碼是禮物

直到問題解決,你不知道什麼是或不是進口。如果上面的建議幫助完成,然後發佈一個合適的SSCCE來證明問題。

+0

我從Window類中刪除了setSize和setMaximumSize調用,並且刪除了JPanel子對象上的所有setPreferedSize調用。 我忘了添加weightx和weighty屬性,這就是爲什麼我必須手動設置大小。 現在,我的問題,我只能滾動horizo​​ntaly。我明天會更新我的第一篇文章。 關於佈局,這是一個要求,但我感謝你的建議。 關於重要的代碼......我知道什麼是重要的或不重要的。我更喜歡接收問題來顯示更多的代碼,而不是很多無聊的代碼。這是我的意見。 – keupsonite

+0

'現在,我的問題,我只能滾動horizo​​ntaly' - 我可以給你答案,但你沒有發佈你的SSCCE,顯然你不再需要任何幫助。 – camickr