1

JPanel のコレクションを含む JPanel を含む JScrollPane があります。

コレクションのサイズは変更できるため、JScrollPane に入れています。

どういうわけか、何をしてもノブがスクローラーに表示されません。

ご覧のとおり、メインの JPanel (プレビュー) にはレイアウトがあります。レイアウトが null の場合、これが発生する可能性があることを読みました。

これを修正する方法を知っている人はいますか?

心に留めておくこと

  • ReactionPreviewPanel は JPanel を拡張します。
  • show(ArrayList) メソッドは、多数の ReactionPreviewPanel を作成し、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);
    }
}
4

1 に答える 1