У меня есть класс, который расширяет JPanel
. Я перезаписал protected void paintComponent(Graphics g)
.
Существует переменная, которая должна быть пересчитана при изменении размеров панели. Как это сделать правильно?
У меня есть класс, который расширяет JPanel
. Я перезаписал protected void paintComponent(Graphics g)
.
Существует переменная, которая должна быть пересчитана при изменении размеров панели. Как это сделать правильно?
Если я правильно понял вопрос, вы должны прочитать раздел из руководства Swing по Как написать компонентный прослушиватель, который показывает вам, как для прослушивания изменения размера компонентов.
Как и Адам Пэйнтер, вы также можете добавить внутренний код к вашему коду, например:
class ResizeListener extends ComponentAdapter {
public void componentResized(ComponentEvent e) {
// Recalculate the variable you mentioned
}
}
Код, который вы ввели между самыми внутренними скобками, будет выполняться каждый раз, когда компонент будет изменен.
Затем вы добавляете этот слушатель к своему компоненту с помощью
myJPanel.addComponentListener(new ResizeListener());
Вы можете получить свой компонент, используя e.getComponent()
. Таким образом, вы можете вызвать любой метод вашего компонента из внутреннего класса, например
e.getComponent().getWeight();
Я полагаю, вы могли бы переопределить различные методы 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);
Самый простой способ - реализовать ComponentListener
:
myjpanel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
//recalculate variable
}
});
Здесь я использовал ComponentAdapter
, потому что я только намерен переопределить componentResized()
.
Он автоматически изменяет размер, если он
Если он не работает, вы, вероятно, забыли один из этих двух.
Здесь я использую (где CoordinatePlane - JPanel):
Я не эксперт
public CoordinatePlane() {
setBackground(Color.WHITE);
this.addComponentListener(new ComponentAdapter(){
public void componentResized(ComponentEvent e) {
//YOUR CODE HERE
}
});
}