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();
}
}