2012-05-14 4 views
0

У меня есть класс под названием MapTile, который расширяет JLabel. То, что я делаю, загружает JPanel с большим количеством MapTile в GridLayout. Я замечаю, что при загрузке в 100x100 MapTile процесс занимает больше времени, чем загрузка в 100x100 JLabel. Это мой класс MapTile.Расширенные классы в java, насколько они громоздкие?

public class MapTile extends JLabel { 
private static final long serialVersionUID = 1L; 
private boolean selected; 
private Point location; 

public MapTile(){ 
    super(); 
    location = new Point(); 
} 
public void setLocation(int x, int y){ 
    setLocation(new Point(x,y)); 
} 
public void setLocation(Point p){ 
    location = p; 
} 
public Point getLocation(){ 
    return location; 
} 
public void setSelected(Boolean b){ 
    selected = b; 
    if (selected){ 
     ((GridPanel)this.getParent()).addToSelection(this); 
     this.setBorder(BorderFactory.createLineBorder(Color.RED)); 
    } else { 
     this.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    } 
    this.repaint(); 
} 
public boolean isSelected(){ 
    return selected; 
} 
} 

Нет ничего необычного, я просто переписал метод setLocation и добавил несколько других методов. Я также добавил только три переменные экземпляра.

Мой вопрос заключается в следующем: расширяет ли класс класс кучу лишнего веса?

Я не могу не думать, что мой класс MapTile довольно прост, но время между загрузкой 100x100 MapTile и загрузкой 100x100 JLabel's сильно отличается. Для загрузки MapTile в больших количествах требуется около 4-5 раз больше, чем JLabels.

ответ

2

Вы не просто перегрузили setLocation но вы создаете новый экземпляр Point каждый раз, когда метод setLocation(int,int) называется, которая может оказать влияние на производительность

Помимо этого: - Вы проверили, что при удалении переопределенном методы, в которых вы больше не испытываете замедление - вы профилировали приложение, чтобы увидеть, где происходит потеря производительности.

О, да, я не думаю, что ваша переопределенная версия setLocation верна. Я боюсь, что вы должны позвонить super.setLocation, если вы хотите, чтобы JLabel вел себя правильно

+0

Так что проблема в том, что я действительно _am_ делаю свой расширенный класс громоздким и медленным? Редактировать: Конечно! Я удалил переменную экземпляра Point только для просмотра, а производительность значительно улучшилась. Спасибо :) –

+0

@ LucasMorgan Исправить. Рад, что вы можете проверить это в своем коде – Robin

Смежные вопросы