我有一个扩展 JScrollPane 的类,它正在创建另一个扩展 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 在构造函数中设置时如何为空?在调试器中运行它表明 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 构造函数中也可以。为什么不能把它分成一个单独的类?