Java Swing GridBagLayout面板调整大小问题
|
我正在为一个亲戚制作一个简单的小摆动应用程序,但是我在实现它的动画时遇到了麻烦……
这是我的布局的描述: 我有一个主窗口(通过实例化,打包和显示JFrame创建). 第二个JPanel也设置为使用GridBagLayout作为其布局.在这种情况下,有两列,一行.左列有一个宽的宽,一行高的JPanel,里面有Button 1.右列只包含一个JButton(按钮2),它也是一列宽,一行高. 这是我刚才描述的截图: 现在您了解了布局是什么,让我解释一下我一直在尝试做什么: 我一直在尝试使用Universal Tween Engine来调整包含Button 1的Jpanel.但是,在我的尝试中,我得到了这个结果: 您可能已经看到,包含Button 1的JPanel已成功调整大小!但是,按钮2的大小和位置根本没有变化,事实上,按钮2被包含按钮1的JPanel切断了! 这是一个问题,因为我希望调整包含Button 1的JPanel的大小,以同时更改其包含的GridBagLayout的单元格大小.看来,我在这件事上非常错误. 所以这让我想到了我的问题……我需要做什么才能“更新”我的GridBagLayout,以便调整其网格大小以适应包含Button 1的Jpanel的大小增加?我试过在我的GridBaglayout上调用GridBagLayout.invalidatelayout(),我也试过在我的主窗口上调用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,1,GridBagConstraints.PAGE_START,GridBagConstraints.VERTICAL,new Insets(0,0),100,0));
pane.add(new JButton("Button B"),100));
pane.add(new JButton("Button C"),2,20));
pane.add(InitPreviewGUI(),new GridBagConstraints(1,3,GridBagConstraints.BOTH,0));
//Finalize the window
mainwindow.pack();
mainwindow.setVisible(true);
}
private static JPanel InitPreviewGUI()
{
JPanel panel = new JPanel(new GridBagLayout());
panel.add(InitSettingsGUI(),0));
panel.add(new JButton("Button 2"),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"));
}
}
如果您想自己编译代码,则需要以下三种资源: > Universal Tween Engine library jar 如果您想亲自体验我的问题,无需复杂的项目设置,您可以下载Eclipse Juno项目或runnable jar文件: > Imaffect Eclipse Juno Project 如果您希望远离下载,请在此列出正在进行的操作: >设置GUI结构 非常感谢任何有关此问题的帮助!谢谢 :) 附:如果这个问题有重复,我很抱歉.我搜索了很多,但我找不到任何与我的问题有关的东西. 解决方法
我会在你的update()方法中说你应该改变Button1的首选大小并调用
container.revalidate(); container.repaint(); 更改首选大小和revalidate()更新布局和repaint()反映了更改. 或者,你可以调用setSize()来增加Button1的宽度,同时减小Button2的宽度,然后再调用repaint()(不需要revalidate(),因为revalidation会恢复原始布局). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
