JScrollPaneを拡張する1つのクラスがあり、JTableを拡張する別のクラスのオブジェクトを作成しています。基本的には次のようになります。
class CustomScrollPane{
private CustomTable table
public CustomScrollPane(..){
table = new CustomTable(this);
..
}
public void scrollToBottom(){
...
}
}
CustomTableクラスで、tableChangedをオーバーライドします。
public class CustomTable extends JTable{
private CustomScrollPane scrollPane;
public CustomTable(CustomScrollPane scrollPane){
super();
this.scrollPane = scrollPane;
}
@Override
public void tableChanged(TableModelEvent e) {
super.tableChanged(e);
scrollPane.scrollToBottom();
}
これを実行すると、tableChanged()のscrollPaneでNullPointerExceptionが発生しますが、それはどのように可能ですか?scrollPaneがコンストラクターで設定されたときにnullになるにはどうすればよいですか?デバッガーで実行すると、コンストラクターの前にtableChanged()が呼び出されることがわかります。条件の追加
if (scrollPane != null)
後でコンストラクターが呼び出されるため、実際に問題が修正されます。また、次のように、JTableを構築済みとして定義します。
table = new JTable(){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
final Component c = super.prepareRenderer(new CustomTableCellRenderer(), row, column);
if (c instanceof JComponent){
((JComponent) c).setOpaque(true);
}
return c;
}
@Override
public void paint(Graphics g) {
int scrolling = scrollPane.getViewport().getViewPosition().y;
super.paint(g);
g.drawImage(image.getImage(), -30, -50 + scrolling, null, null);
}
@Override
public void tableChanged(TableModelEvent e) {
super.tableChanged(e);
scrollPane.scrollToBottom();
}
};
CustomScrollPaneコンストラクターで直接機能します。なぜそれを別のクラスに分割できないのですか?