0

JPanel(の)に一連のコンポーネントを追加するプログラムがありますJScrollbar。ただし、非常に多くのコンポーネントが追加されるため、それらのほとんどは可視領域 ( ) に収まりませんViewport

すべてが読み込まれ、下にスクロールし始めると、コンポーネントがViewport領域に入ると、コンポーネントが整列して位置を設定していることに気付きます。そのため、JScrollPane必要以上に高くなります。これにより、最後に到達すると「スナップ」します(コンポーネントが突然上に移動し(適切に整列し)、ビューポートも同様です)。

と を呼び出してみrepaint()ましvalidate()たが、何の効果もありませんでした。私は何を間違っていますか?

4

1 に答える 1

7

特定の問題を正確に再現するために、 SSCCEを投稿することをお勧めします。

私はあなたを正しい方向に導くかもしれない短い例をしました。

基本的には225を追加するだけJButtonJPanelGridLayoutこれを使用してに追加されJScrollPaneます。

ここに画像の説明を入力してください

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class JScrollPaneOfComponents {

    /**
     * Default constructor for ScrollBarOfComponents.class
     */
    public JScrollPaneOfComponents() {
        initComponents();
    }

    /**
     * Initialize GUI and components (including ActionListeners etc)
     */
    private void initComponents() {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new GridLayout(15, 15));

        //create 225 JButtons and add them to JPanel;
        for (int i = 0; i < (15*15); i++) {
            panel.add(new JButton(String.valueOf((i + 1))) {
                //make buttons bigger for demonstartion purposes
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 100);
                }
            });
        }

        JScrollPane scrollpane = new JScrollPane(panel) {
            //size the JScrollPane purposelfully smaller than all components
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        //add scrollpane to frame
        jFrame.add(scrollpane);

        //pack frame (size JFrame to match preferred sizes of added components and set visible
        jFrame.pack();
        jFrame.setVisible(true);
    }

    public static void main(String[] args) {

        /**
         * Create GUI and components on Event-Dispatch-Thread
         */
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    //set nimbus look and feel
                    for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }
                //create new instance of GUI
                JScrollPaneOfComponents test = new JScrollPaneOfComponents();
            }
        });
    }
}
于 2012-11-05T18:14:51.490 に答える