2

垂直ボックスを含む JScrollPane があります。Box の上部に新しい JPanel を挿入しています。スクロールバーを使用して下にスクロールする場合、現在のビューを下にスクロールした場所に残しておきたいと思います。たとえば、ボックスに 50 個のパネルがあり、スクロールバーを使用してパネル 20 を表示する場合、他のボックスが上に追加されていても、ビューをボックス 20 のままにしたいと思います。さらに、スクロールバーを使用して上にスクロールすると、新しいパネルが追加されたときにビューに表示されるようになります。これを行う方法はありますか?

ところで、JScrollPane または Box を使用する必要はありません。サンプル コードは、私がやろうとしていることを説明するためのものです。

コード例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestScrollPane extends JFrame {

    JScrollPane scrollPane;
    ボックスボックス;
    private static int panelCount = 0;

    public TestScrollPane() {
        setPreferredSize(new Dimension(200, 400));
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        scrollPane = new JScrollPane();
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);
        scrollPane.getVerticalScrollBar().setUnitIncrement(15);
        box = Box.createVerticalBox();
        scrollPane.getViewport().add(box);

        this.add(scrollPane);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(真);

        タイマー t = new Timer(500, new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                box.add(新しい TestPanel(), 0);
                scrollPane.validate();
            }
        });
        t.setRepeats(真);
        t.start();
    }

    public class TestPanel extends JPanel {

        int myId = panelCount++;

        public TestPanel() {
            this.setLayout(新しい GridBagLayout());
            this.setBorder(BorderFactory.createBevelBorder(1));
            JLabel label = new JLabel("" + myId);
            label.setHorizo​​ntalAlignment(JLabel.CENTER);
            label.setVerticalAlignment(JLabel.CENTER);

            this.setMaximumSize(new Dimension(100, 100));
            this.setPreferredSize(new Dimension(100, 100));

            this.add(ラベル);
        }
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                TestScrollPane testScrollPane = new TestScrollPane();
            }
        });
    }
}

編集:これは、コードを変更することになった方法です。当たり前のことを見ないのはちょっとばかげている気がします。とにかく、助けてくれた人に感謝します。

            public void actionPerformed(ActionEvent ae) {
                ポイント ビュー = scrollPane.getViewport().getViewPosition();
                TestPanel パネル = 新しい TestPanel();
                box.add(パネル、0);
                scrollPane.validate();
                if (view.y != 0) {
                    view.y += panel.getHeight();
                    scrollPane.getViewport().setViewPosition(ビュー);
                }
            }

ところで、私はこの質問をhttp://www.coderanch.com/t/528829/GUI/java/JScrollPane-adding-JPanels-at-top#2398276に相互投稿しま​​した。

4

2 に答える 2

0

可視にしたいコンポーネントの境界を (JComponent の getBounds メソッドを使用して) 取得し、それを JViewPort の scrollRectToVisible メソッドへの入力として使用できます。

于 2011-02-27T11:06:22.117 に答える
0

何かのようなもの:

    Timer t = new Timer(1000, new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            TestPanel panel = new TestPanel();
            box.add(panel, 0);
            JViewport vp = scrollPane.getViewport();
            Point p = vp.getViewPosition();
            p.y += panel.getPreferredSize().height;
            scrollPane.revalidate();
            vp.setViewPosition(p);
        }
    });
于 2011-02-27T16:12:56.307 に答える