Обычно это используется для как будто полиморфных шаблонов, где Вы не должны быть в состоянии выбрать производный класс во времени выполнения, только во время компиляции. Это может сохранить издержки виртуальной функции, заходят во время выполнения.
Если я правильно понял вопрос, тогда вам следует прочитать раздел из учебника Swing на Как написать компонентный слушатель , в котором показано, как отслеживать изменение размера компонентов.
Я полагаю, вы могли бы переопределить различные методы setSize
и resize
и выполнить там вычисления. Однако вы можете не найти всех мест, где можно изменить размер. Вы можете захотеть, чтобы ваш класс реализовал ComponentListener и просто слушал сам себя на предмет событий изменения размера.
Предупреждение: Я не эксперт по Swing.
Предупреждение: Я не скомпилировал этот код.
public class MyJPanel extends JPanel implements ComponentListener {
public MyJPanel() {
this.addComponentListener(this);
}
public void paintComponent(Graphics g) {
// Paint, paint, paint...
}
public void componentResized(ComponentEvent e) {
// Perform calculation here
}
public void componentHidden(ComponentEvent e) {}
public void componentMoved(ComponentEvent e) {}
public void componentShown(ComponentEvent e) {}
}
Если расчет не занимает много времени, я бы просто каждый раз пересчитывал значение в paintComponent ()
.
В противном случае вы можете сохранить значение это размер компонента, и сравните его с новым размером в paintComponent
. Если размер изменился, пересчитайте, в противном случае - не делайте этого.
private Dimension size;
protected void paintComponent(Graphics g){
if (!size.equals(getSize())){
size = getSize();
// recalculate value
}
}
Или вы можете выполнить расчет по событию изменения размера.
private CompoentListener resizeListener = new ComponentAdapter(){
public void componentResized(ActionEvent e){
// recalculate value
}
};
//in the constructor add the line
addComponentListener(resizeListener);