在Mac OS X中,某些窗口在不同標籤(例如系統偏好設置窗口)之間切換時,會通過逐漸動畫(增大/縮小)更改其大小。 使用JFrame(Java)實現這種效果的最佳方式是什麼?沒有視覺閃爍或性能下降。JFrame動畫調整大小Mac OS X風格
謝謝。
在Mac OS X中,某些窗口在不同標籤(例如系統偏好設置窗口)之間切換時,會通過逐漸動畫(增大/縮小)更改其大小。 使用JFrame(Java)實現這種效果的最佳方式是什麼?沒有視覺閃爍或性能下降。JFrame動畫調整大小Mac OS X風格
謝謝。
縮小一點點
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();
我使用一個單一的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;
}
類文件
}
這是從後臺線程調用Swing方法,所以我不確定它可以被推薦。 – Trejkaz 2014-07-07 03:45:04