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会恢复原始布局). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |