1

paintComponentでテキストを描画するカスタムJComponentを作成しました。ScrollPaneに配置する追加されたテキストがビューポートを超えたときに、自動的にスコルバーを表示したいと思います。フレーム全体のサイズを変更すると、スクロールバーが正しく更新されます。しかし、私はそれをプログラムでやりたいと思います。いくつかの#validate()と#invalidate()の呼び出しを試しましたが、役に立ちませんでした。

クライアントとしてカスタムコンポーネントを使用してスクロールペインのスクロールバーを更新するにはどうすればよいですか?

私が意味することを示すために、単純化された実行可能な例を作成しました。

package swingscroll;

import java.awt.Color;
import java.awt.Dimension;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class SwingScroll {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        final JFrame frame = new JFrame(SwingScroll.class.getSimpleName());
        final JComponent myComponent = new JComponent() {
            private Dimension preferredSize;

            @Override
            public void setPreferredSize(Dimension preferredSize) {
                super.setPreferredSize(preferredSize);
                this.preferredSize = preferredSize;
            }


            @Override
            public Dimension getPreferredSize() {
                return this.preferredSize;
            }

        };
        myComponent.setPreferredSize(new Dimension(380, 50));

        final JScrollPane scrollPane = new JScrollPane(myComponent);
        frame.getContentPane().add(scrollPane);

        frame.setSize(400, 100);
        frame.setVisible(true);

        // simulate the internal change of preferredSize in myComponent
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(SwingScroll.class.getName()).log(Level.SEVERE, null, ex);
                }
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // this should trigger the scrollbar right?
                        myComponent.setPreferredSize(new Dimension(380, 1000));
                        // TODO insert code to update scrollbars
                    }
                });
            }
        }).start();
    }
}
4

1 に答える 1

5
// TODO insert code to update scrollbars
myComponent.revalidate();

あなたのコメントを見たばかりです:

簡単な例で再検証を追加して再描画しても、スクロールバーが更新されません。

Worksforme-ここでの例の問題は、スクロールバーが常に表示されているため、何も起こらないように見えることです。最初は垂直スクロールバーが実際にないようにサイズを調整してから、バーを表示する必要がある高さに更新すると問題ありません。

ところで:この例のsetPrefは、実稼働コードではなく、デモンストレーション用であると思います。

于 2012-09-02T12:56:29.377 に答える