JFrame анимированное изменение размера в стиле Mac OS X - PullRequest
4 голосов
/ 22 марта 2011

В Mac OS X некоторые окна изменяют свой размер с постепенной анимацией (увеличение / уменьшение) при переключении между различными вкладками (например, окно «Системные настройки»).Как лучше всего добиться такого эффекта, используя JFrame (Java) без визуального мерцания или снижения производительности.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 января 2013

немного уменьшиться

new Thread(new Runnable()
{
   public void run()
   {
        Dimension dim = jframe.getSize();
        while (dim.getHeight() >= someheightintegeryouwanttoshrintto)
        {
            try
            {
                jframe.setSize((int)(dim.getWidth()), (int)(dim.getHeight()-1));
                Thread.sleep(1);
            }
            catch(InterruptedException ex) 
            {

            }
            dim = jframe.getSize();
        }
    }
}).start();

немного увеличиться

new Thread(new Runnable()
{
   public void run()
   {
        Dimension dim = jframe.getSize();
        while (dim.getHeight() <= sometheightyouwanttoincreaseto)
        {
            try
            {
                jframe.setSize((int)(dim.getWidth()), (int)(dim.getHeight()+1));
                Thread.sleep(1);
            }
            catch(InterruptedException ex) 
            {

            }
            dim = jframe.getSize();
        }
    }
}).start();
0 голосов
/ 30 сентября 2014

Я использую один JFrame и изменяю его размер после замены JPanels.Это дает стиль анимации в Mac OS X. (В классе LauncherTask может потребоваться небольшое изменение параметров, чтобы сделать его более идеальным для анимации)

Я поместил эту строку кода в основной класс JFrame, т.е. Launcher.java.в моем случае.Класс конфигурации расширяет класс JPanel, и я использую this.setPreferredSize () для установки его размера (он будет использоваться в классе LauncherTask для соответствующего изменения размера)

(new Thread(new Configuration(this))).start();

Это файл класса для изменения размера Jpanels

package com.imoz;

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.SwingWorker;

public class LauncherTask extends SwingWorker<Void, Void> {

float x,y,dx,dy,pixel;
private JFrame parent;
private Dimension target;

public LauncherTask(JFrame parent, Dimension target) {
    this.parent = parent;
    this.target = target;
}

@Override
protected Void doInBackground() throws Exception {
    dx = (float) Math.abs(parent.getWidth() - target.getWidth());
    dy = (float) Math.abs(parent.getHeight() - target.getHeight());

    if( dx >= dy )
        pixel=dx;
    else
        pixel=dy;

    pixel /= 7.5;
    dx=dx/pixel;
    dy=dy/pixel;
    x=parent.getWidth();
    y=parent.getHeight();

    boolean dxGrow = true, dyGrow = true;
    if(parent.getWidth() < target.getWidth())
        dxGrow = false;
    if(parent.getHeight() < target.getHeight())
        dyGrow = false;

    float i = 1f;
    while(i <= pixel)
    {
        if(dxGrow)
            x -= dx;
        else
            x += dx;
        if(dyGrow)
            y -= dy;
        else
            y += dy;

        parent.setSize((int)x, (int)y);
        parent.setLocationRelativeTo(null);
        parent.invalidate();

        i+=1;
    }
    parent.setSize((int)target.getWidth(), (int)target.getHeight());
    parent.setLocationRelativeTo(null);
    return null;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...