垂直ボックスを含む 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.setHorizontalAlignment(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に相互投稿しました。