Как “сделать что-то” на изменении размеров компонента Swing?

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

20
задан Lukas Rotter 14 December 2015 в 17:29
поделиться

3 ответа

Если я правильно понял вопрос, тогда вам следует прочитать раздел из учебника Swing на Как написать компонентный слушатель , в котором показано, как отслеживать изменение размера компонентов.

13
ответ дан 29 November 2019 в 22:44
поделиться

Я полагаю, вы могли бы переопределить различные методы 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) {}

}
17
ответ дан 29 November 2019 в 22:44
поделиться

Если расчет не занимает много времени, я бы просто каждый раз пересчитывал значение в 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);
4
ответ дан 29 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: