私が取り組んでいる特定の GUI プロジェクトでは、タブなどを含むペインを含む JFrame があります。タブごとにサイズが異なるため、ウィンドウのサイズをそのサイズに変更したかったのですが、setSizeを呼び出してサイズにスナップするだけではなく、サイズにスムーズにスライドさせたいです。私は次の基本的なコードでこれを達成しました:
private class Resizer implements Runnable {
private int nw, nh, runs, sizex, sizey;
private float width, height, wpms, hpms, decay = 0.994f;
private Future future;
public Resizer(int newwidth, int newheight){
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
sizex = d.width;
sizey = d.height;
width = frame.getWidth();
height = frame.getHeight();
wpms = (float)(newwidth - frame.getWidth()) / 1000;
wpms *= 6;
hpms = (float)(newheight - frame.getHeight()) / 1000;
hpms *= 6;
nw = newwidth;
nh = newheight;
runs = 0;
}
public void run(){
runs++;
if (runs == 1000){
frame.setSize(nw, nh);
future.cancel(true);
canResize = true;
return;
}
width += wpms;
wpms *= decay;
height += hpms;
hpms *= decay;
if (height + frame.getY() > sizey)
frame.setLocation(frame.getX(), frame.getY() - (int)(frame.getY() + height - sizey));
frame.setSize((int) width, (int) height);
frame.repaint();
}
public void setFuture(Future f){
future = f;
}
}
public boolean resizeTo(int width, int height){
if (canResize){
canResize = false;
Resizer r = new Resizer(width, height);
r.setFuture(timer.scheduleAtFixedRate(r, 0, 2, TimeUnit.MILLISECONDS));
return true;
}
return false;
}
しかし、サイズ変更中に setSize を大量に使用したことが原因であることがわかったメモリリーク (数回サイズ変更した後に 20k から 150k になる) があるようです。
リークを修正する方法やサイズを変更する別の方法はありますか?