Я пытаюсь изменить размер JFrame при нажатии кнопки, код работает хорошо (но я не знаю, является ли это лучшим способом для достижения этого).Java - Повторная проверка JFrame при изменении размера
Но проблема в следующем: При изменении размера JFrame медленно переоценивается. GIF может объяснить, что именно происходит:
кусок кода:
chatButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
new Thread (new Runnable() {
public void run(){
int width = frame.getWidth();
int height = frame.getHeight();
int buttonWidth = chatButton.getWidth();
if (frame.getWidth() < 1150) {
while (frame.getWidth() < 1150) {
width = frame.getWidth();
frame.setSize(width + 2 , height);
chatButton.setLocation(width - buttonWidth , 0);
frame.invalidate();
frame.validate();
}
} else {
while (frame.getWidth() > 897) {
width = frame.getWidth();
frame.setSize(width - 2 , height);
chatButton.setLocation(width - buttonWidth , 0);
frame.invalidate();
frame.validate();
}
}
}
}).start();
}
});
Я положил его в Runnable, потому что он не был до тех пор, подтверждение значимости изменения размера не более ,
Я также пробовал repaint()
и revalidate()
, но они не решили проблему вообще.
Что я могу сделать?
Заранее спасибо.
Лично я не уверен, что вы найдете полностью удовлетворительное решение. Основная причина заключается в том, что при изменении размера окна содержимое не всегда обновляется немедленно, менеджер перерисовки может уменьшить повторяющиеся вызовы обновлений до меньшего количества фактических обновлений, попробуйте изменить размер окна вручную, чтобы увидеть, что я имею в виду – MadProgrammer
'chatButton. setLocation (width - buttonWidth, 0); 'this подразумевает нулевой макет. Java GUI должны работать с различными ОС, размером экрана, разрешением экрана и т. Д., Используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). ** Далее следует отметить, что его часть должна выполняться с помощью таймера Swing '' Timer', поэтому на EDT выполняются обновления GUI. ** –
Для лучшей помощи в ближайшее время опубликуйте [MCVE] или [Short, Self Contained, Correct Example ] (http://www.sscce.org/). –