Подтвердить что ты не робот

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

У меня есть класс, который расширяет JPanel. Я перезаписал protected void paintComponent(Graphics g).

Существует переменная, которая должна быть пересчитана при изменении размеров панели. Как это сделать правильно?

4b9b3361

Ответ 2

Как и Адам Пэйнтер, вы также можете добавить внутренний код к вашему коду, например:

class ResizeListener extends ComponentAdapter {
        public void componentResized(ComponentEvent e) {
            // Recalculate the variable you mentioned
        }
}

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

Затем вы добавляете этот слушатель к своему компоненту с помощью

myJPanel.addComponentListener(new ResizeListener());

Вы можете получить свой компонент, используя e.getComponent(). Таким образом, вы можете вызвать любой метод вашего компонента из внутреннего класса, например

e.getComponent().getWeight();

Ответ 3

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

}

Ответ 4

Если вычисление не занимает много времени, я бы просто пересчитывал значение каждый раз в 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);

Ответ 5

Самый простой способ - реализовать ComponentListener:

myjpanel.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        //recalculate variable
    }
});

Здесь я использовал ComponentAdapter, потому что я только намерен переопределить componentResized().

Ответ 6

Он автоматически изменяет размер, если он

  • внутри панели BorderLayout и
  • положить там как BorderLayout.CENTER компонент.

Если он не работает, вы, вероятно, забыли один из этих двух.

Ответ 7

Здесь я использую (где CoordinatePlane - JPanel):

Я не эксперт

public CoordinatePlane() {
    setBackground(Color.WHITE);
    this.addComponentListener(new ComponentAdapter(){
        public void componentResized(ComponentEvent e) {
            //YOUR CODE HERE         
        }
    });
}