2011-03-22 104 views
4

在Mac OS X中,某些窗口在不同標籤(例如系統偏好設置窗口)之間切換時,會通過逐漸動畫(增大/縮小)更改其大小。 使用JFrame(Java)實現這種效果的最佳方式是什麼?沒有視覺閃爍或性能下降。JFrame動畫調整大小Mac OS X風格

謝謝。

回答

2

縮小一點點

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

這是從後臺線程調用Swing方法,所以我不確定它可以被推薦。 – Trejkaz 2014-07-07 03:45:04

0

我使用一個單一的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; 
} 
類文件

}