Ваша проблема заинтриговала меня. После некоторого исследования, я думаю, я подтвердил кое-что, что я помню о настройке состояния окна (развернуто, восстановлено и т. Д.), А именно то, что установка состояния является запросом к операционной системе и оставлена на усмотрение ОС для обработки запроса. Это означает, что он асинхронный или, по крайней мере, будет сделан позже, после того, как вы его установите. Я подтвердил использование регистрации и добавления слушателей изменения размера, где вы можете видеть, что размер кадра изменяется после выхода вашего блока кода. Из-за этого pack () будет размещать компоненты в соответствии с их предпочтительным размером. Итак, представьте, что рамка имеет размеры 800x600 и компоненты расположены как таковые (кнопка расположена горизонтально по центру около 400). Затем ОС изменяет размер кадра на полный экран (например, 1024x768) - на мгновение вы увидите, что кнопка все еще имеет значение 400. Затем кадр обрабатывает новый размер, перекладывает компоненты и центрирует кнопку. около 512. Таким образом, вы увидите мерцание, когда оно переходит во время этого процесса. Возможно, решение состоит в том, чтобы НЕ упаковывать () - он останется равным нулю, и пользователь увидит минимальное мерцание.
Попробуйте сначала изменить это:
// pack()
Если это выглядит хорошо, у вас может быть следующая проблема ... если пользователь нажимает кнопку восстановления, весь кадр сжимается в черную дыру. Поэтому попробуйте вызвать пакет ПОСЛЕ того, как размер кадра будет предсказуемо изменен из-за максимизации. Как то так:
f.addComponentListener( new ComponentAdapter( ComponentEvent e ) {
public void componentResized( Component) {
if( f.getSize().getWidth() > 0 ) {
e.getComponent().removeComponentListener( this );
((JFrame)e.getComponent()).pack();
}
}
}
Так что, если пользователь позже нажмет кнопку восстановления, рамка будет иметь прекрасный упакованный размер, готовый к работе.
- Обновление
ОК, последняя попытка. Хотя я думаю, что в моем описании проблемы есть доля правды, предложенные решения ничего не сделали. Вот последняя попытка Удалите pack () и setPreferredSize () и замените его настройкой размера экрана. Кажется, это сильно уменьшает мерцание в моей системе. Это потому, что не должно быть никакой разницы между исходным макетом и максимизированным макетом, сделанным позже. Вы можете увидеть это, если вы переключаетесь между восстановлением и максимальным. Несмотря на то, что при переключении этих двух устройств я все еще вижу очень слабое мерцание, по крайней мере, при первом отображении оно выглядит лучше.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TEST {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
System.out.println("Debug test...");
JPanel btnPnl = new JPanel();
btnPnl.add(new JButton("TEST"));
JFrame f = new JFrame("TEST");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(btnPnl);
// f.setPreferredSize(new Dimension(800, 600));
// f.pack();
f.setSize( Toolkit.getDefaultToolkit().getScreenSize() );
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true);
System.out.println("End debug test!");
}
});
-Mike