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);
}
}
我不認爲有更多的細節是必要的......包含面板與預覽窗格(比scrollpane大)沒有任何關係。 –