2013-05-20 75 views
1

我有一个JScrollPane,其中包含一个包含JPanel集合的JPanel。包含JPanel的JScrollPane不会滚动

集合的大小可以改变,这就是为什么我在一个JScrollPane中。

出于某种原因,无论我做什么,旋钮都不会显示在滚动条上。如您所见,主JPanel(预览)确实有布局。我读过,如果布局为空,这可能会发生。

有谁知道如何解决这个问题?

铭记着

  • ReactionPreviewPanel扩展JPanel。
  • show(ArrayList)方法将创建一堆ReactionPreviewPanels并使用SpringLayout将它们组织到主(预览)JPanel中。

这里是我的代码:

import java.awt.Color; 
import java.awt.Toolkit; 
import java.awt.datatransfer.StringSelection; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.SpringLayout; 
import javax.swing.SwingConstants; 

public class ResultsPanel extends JPanel 
{ 
    private static final long serialVersionUID = -1713825505191028954L; 
    private JTextPane name, url, tags; 
    private JButton clear; 
    private JLabel results; 
    private JScrollPane scroller; 
    private JPanel previews; 

    public ResultsPanel() 
    { 
     super(); 
     initElements(); 
     addElements(); 
     setLayout(getSpringLayout()); 
    } 

    private void initElements() 
    { 
     this.previews = new JPanel(); 
     this.previews.setLayout(new SpringLayout()); 
     this.previews.setBackground(Color.white); 
     this.scroller = new JScrollPane(this.previews, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     this.scroller.getVerticalScrollBar().setUnitIncrement(1); 
     this.results = new JLabel("[Displaying nothing]"); 
     this.results.setHorizontalAlignment(SwingConstants.CENTER); 

     this.name = new JTextPane(); 
     this.name.setEditable(false); 
     this.url = new JTextPane(); 
     this.url.setEditable(false); 
     this.tags = new JTextPane(); 
     this.tags.setEditable(false); 
     this.clear = new JButton("Clear"); 
     this.clear.setEnabled(false); 
    } 

    private void addElements() 
    { 
     add(clear); 
     add(this.results); 
     add(this.scroller); 
    } 

    private SpringLayout getSpringLayout() 
    { 
     SpringLayout layout = new SpringLayout(); 
     layout.putConstraint(SpringLayout.SOUTH, this.clear, -5, SpringLayout.SOUTH, this); 
     layout.putConstraint(SpringLayout.EAST, this.clear, -5, SpringLayout.EAST, this); 
     layout.putConstraint(SpringLayout.WEST, this.clear, 5, SpringLayout.WEST, this); 
     layout.putConstraint(SpringLayout.NORTH, this.results, 5, SpringLayout.NORTH, this); 
     layout.putConstraint(SpringLayout.EAST, this.results, -5, SpringLayout.EAST, this); 
     layout.putConstraint(SpringLayout.WEST, this.results, 5, SpringLayout.WEST, this); 
     layout.putConstraint(SpringLayout.NORTH, this.scroller, 2, SpringLayout.SOUTH, this.results); 
     layout.putConstraint(SpringLayout.EAST, this.scroller, -5, SpringLayout.EAST, this); 
     layout.putConstraint(SpringLayout.WEST, this.scroller, 5, SpringLayout.WEST, this); 
     layout.putConstraint(SpringLayout.SOUTH, this.scroller, -2, SpringLayout.NORTH, this.clear); 
     return layout; 
    } 

    public void show(ArrayList<Reaction> reactions) 
    { 
     this.results.setText(reactions.size() + " results"); 
     this.previews.removeAll(); 
     this.previews.repaint(); 
     if (reactions == null || reactions.size() == 0) 
      return; 
     ArrayList<ReactionPreviewPanel> panels = new ArrayList<ReactionPreviewPanel>(); 
     for (Reaction r : reactions) 
     { 
      ReactionPreviewPanel temp = new ReactionPreviewPanel(r); 
      panels.add(temp); 
     } 
     for (ReactionPreviewPanel rpp : panels) 
      this.previews.add(rpp); 
     SpringLayout layout = new SpringLayout(); 
     for (int i = 0; i < panels.size(); i++) 
     { 
      layout.putConstraint(SpringLayout.WEST, panels.get(i), 2, SpringLayout.WEST, this.previews); 
      layout.putConstraint(SpringLayout.EAST, panels.get(i), -3, SpringLayout.EAST, this.previews); 
      if (i == 0) 
       layout.putConstraint(SpringLayout.NORTH, panels.get(i), 2, SpringLayout.NORTH, this.previews); 
      else 
       layout.putConstraint(SpringLayout.NORTH, panels.get(i), 2, SpringLayout.SOUTH, panels.get(i - 1)); 
     } 
     this.previews.setLayout(layout); 
    } 
} 

回答

0

如果没有更多的细节,我猜你ResultsPanel容器扩大到包含整个ResultsPanel,这样滚动条是永远必要的。强制限制结果面板和/或结果面板容器的最大尺寸。

+0

我不认为有更多的细节是必要的......包含面板与预览窗格(比scrollpane大)没有任何关系。 –