2016-02-09 5 views
0

Я пытаюсь изменить размер JFrame при нажатии кнопки, код работает хорошо (но я не знаю, является ли это лучшим способом для достижения этого).Java - Повторная проверка JFrame при изменении размера

Но проблема в следующем: При изменении размера JFrame медленно переоценивается. GIF может объяснить, что именно происходит:

GIF Picture of the problem

кусок кода:

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(), но они не решили проблему вообще.

Что я могу сделать?

Заранее спасибо.

+0

Лично я не уверен, что вы найдете полностью удовлетворительное решение. Основная причина заключается в том, что при изменении размера окна содержимое не всегда обновляется немедленно, менеджер перерисовки может уменьшить повторяющиеся вызовы обновлений до меньшего количества фактических обновлений, попробуйте изменить размер окна вручную, чтобы увидеть, что я имею в виду – MadProgrammer

+0

'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. ** –

+0

Для лучшей помощи в ближайшее время опубликуйте [MCVE] или [Short, Self Contained, Correct Example ] (http://www.sscce.org/). –

ответ

0

Это происходит из-за того, что вы настраиваете размеры компонентов качания из нитеобразной нити. Это приведет к тому, что размер окна не синхронизируется с фактическим перемещением компонентов. Заставляя внутренний код запускать таймер, tat активируется каждые 50 миллисекунд, вы можете получить гладкое открытие без дрожания.

timer = new Timer(50, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     int width = frame.getWidth(); 
     int height = frame.getHeight(); 
     int buttonWidth = chatButton.getWidth(); 
     if(frame.getWidth() < 1150) { 
      width = frame.getWidth(); 
      frame.setSize(width + 2 , height); 
      chatButton.setLocation(width - buttonWidth , 0); 
      frame.invalidate(); 
      frame.validate(); 
     } else { 
      ((Timer)e.getSource()).cancel() 
     } 
    }); 
timer.setInitialDelay(0); 
timer.start(); 

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

+0

благодарю вас за ваш ответ, но я сожалею, что не мог узнать, где именно поставить таймер, следует ли положить его в chatButton ActionListener? или где-то еще? –

+0

Внутри actionlistener, после того, как вы проверили, нужно ли увеличить окно в сторону или уменьшить – Ferrybig

+0

@SamerMassad Используйте его вместо своего 'Thread' – MadProgrammer

Смежные вопросы