Geo*_*sen 5 java animation swing resize tween
我正在为一个亲戚制作一个简单的小摆动应用程序,但是我在实现它的动画时遇到了麻烦......
这是我的布局的描述:
我有一个主窗口(通过实例化,打包和显示JFrame创建).我告诉主窗口的内容面板使用GridBagLayout作为其布局.我的网格宽2格,高3格.在第一列中,我有三个JButton(A,B和C),每个JButtons占据一行垂直网格空间,一列水平网格空间.在第二列中,我有另一个JPanel,它是一列宽,三行高.
第二个JPanel也设置为使用GridBagLayout作为其布局.在这种情况下,有两列,一行.左列有一个宽的宽,一行高的JPanel,里面有Button 1.右列只包含一个JButton(按钮2),它也是一列宽,一行高.
这是我刚才描述的截图:

现在您了解了布局是什么,让我解释一下我一直在尝试做什么:
我一直在尝试使用通用补间引擎来调整包含按钮1的Jpanel.但是,在我的尝试中,我得到了这个结果:

您可能已经看到,包含Button 1的JPanel已成功调整大小!但是,按钮2的大小和位置根本没有变化,事实上,按钮2被包含按钮1的JPanel切断了!
这是一个问题,因为我希望调整包含Button 1的JPanel的大小,以同时更改其包含的GridBagLayout的单元格大小.看来,我在这件事上非常错误.
所以这使我想到我的问题...我需要什么,以"更新"我的GridBagLayout的,这样它会调整其电网,以适应从JPanel的包含按钮1尺寸的增加呢?我试过调用GridBagLayout.invalidatelayout()我的GridBaglayout,我也试过调用JFrame.getContentPane().invalidate()我的主窗口.似乎都没有任何影响.
这是我的项目的可编译源代码:
ImageManager.java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import aurelienribon.tweenaccessors.swing.*;
import aurelienribon.utils.swing.*;
import aurelienribon.tweenengine.*;
import aurelienribon.tweenengine.equations.*;
public class ImageManager
{
/**
* @param args
*/
public static JFrame mainwindow;
public static TweenManager tweenManager;
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() //For thread safety!
{
public void run()
{
InitGUI();
InitTween();
}
});
}
private static void InitTween()
{
((Window)mainwindow).addWindowListener(new WindowAdapter() {
@Override public void windowOpened(WindowEvent e)
{
new DrawingCanvas()
{
@Override protected void update(int elapsedMillis)
{
tweenManager.update(elapsedMillis);
}
}.start();
}
});
}
private static void InitGUI()
{
//Init the window and layout systems
mainwindow = new JFrame("Imaffect");
Container pane = mainwindow.getContentPane();
pane.setLayout(new GridBagLayout());
//Begin creating the UI!
pane.add(new JButton("Button A"), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 0));
pane.add(new JButton("Button B"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 100));
pane.add(new JButton("Button C"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 20));
pane.add(InitPreviewGUI(), new GridBagConstraints(1, 0, 1, 3, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0));
//Finalize the window
mainwindow.pack();
mainwindow.setVisible(true);
}
private static JPanel InitPreviewGUI()
{
JPanel panel = new JPanel(new GridBagLayout());
panel.add(InitSettingsGUI(), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0));
panel.add(new JButton("Button 2"), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0));
return panel;
}
private static JPanel InitSettingsGUI()
{
JPanel panel = new JPanel();
SetupSettingsTweens(panel);
SetupSettingsContent(panel);
return panel;
}
private static void SetupSettingsTweens(JPanel panel)
{
Tween.registerAccessor(Component.class, new ComponentAccessor());
tweenManager = new TweenManager();
Tween.to(panel, ComponentAccessor.WIDTH, 1000)
.target(200)
.ease(Cubic.INOUT)
.repeatYoyo(-1, 200)
.delay(500)
.start(tweenManager);
}
private static void SetupSettingsContent(JPanel panel)
{
panel.add(new JButton("Button 1"));
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想自己编译代码,则需要以下三种资源:
如果您想亲自体验我的问题,无需复杂的项目设置,您可以下载Eclipse Juno项目或runnable jar文件:
如果您希望远离下载,请在此列出正在进行的操作:
非常感谢任何有关此问题的帮助!谢谢 :)
PS如果这个问题有重复,我很抱歉.我搜索了很多,但我找不到任何与我的问题有关的东西.
我想说在你的update()方法中你应该改变 Button1 的首选大小并调用
container.revalidate();
container.repaint();
Run Code Online (Sandbox Code Playgroud)
更改首选尺寸并revalidate()更新布局并repaint()反映更改。
或者,您可以调用setSize()Button1 增加宽度,同时减小 Button2 的宽度,然后再次调用repaint()(不需要revalidate(),因为重新验证会恢复原始布局)。
| 归档时间: |
|
| 查看次数: |
1609 次 |
| 最近记录: |