Я использую один 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;
}
}