Java Swing GridBagLayout面板调整大小问题

Java Swing GridBagLayout面板调整大小问题,java,swing,animation,resize,tween,Java,Swing,Animation,Resize,Tween,我正在为一个亲戚开发一个简单的小swing应用程序,但在实现它的动画时遇到了麻烦 以下是我的布局说明: 我有一个主窗口(通过实例化、打包和显示JFrame创建)。 我已经告诉主窗口的内容面板使用GridBagLayout作为其布局。 我的网格宽2格,高3格。在第一列中,我有三个jbutton(A、B和C),每个jbutton占用一行垂直网格空间,一列占用一列水平网格空间。在第二列中,我有另一个JPanel,它有一列宽,三行高 第二个JPanel也被设置为使用GridBagLayout作为其布局。

我正在为一个亲戚开发一个简单的小swing应用程序,但在实现它的动画时遇到了麻烦

以下是我的布局说明:

我有一个主窗口(通过实例化、打包和显示JFrame创建)。 我已经告诉主窗口的内容面板使用GridBagLayout作为其布局。 我的网格宽2格,高3格。在第一列中,我有三个jbutton(A、B和C),每个jbutton占用一行垂直网格空间,一列占用一列水平网格空间。在第二列中,我有另一个JPanel,它有一列宽,三行高

第二个JPanel也被设置为使用GridBagLayout作为其布局。在本例中,有两列和一行。左列有一个宽一行高的JPanel,内有按钮1。右边的列只包含一个JButton(按钮2),它也是一列宽,一行高

以下是我刚才描述的屏幕截图:

现在您了解了布局是什么,让我解释一下我一直在尝试做什么:

我一直在尝试使用来调整包含按钮1的Jpanel的大小。然而,在我的尝试中,我得到了以下结果:

正如您可能看到的,包含按钮1的JPanel已成功调整大小!然而,按钮2的大小和位置根本没有改变,事实上,按钮2被包含按钮1的JPanel切断了

这是一个问题,因为我希望调整包含按钮1的JPanel的大小,以同时更改其包含GridBagLayout的单元格大小。看来我在这件事上大错特错了

这就引出了我的问题。。。我需要做什么才能“更新”我的GridBagLayout,使其调整网格大小以适应包含按钮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, 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"));
    }
}
如果您想自己编译代码,则需要以下三种资源:

  • (包装AurelinerBon.utils.swing)
  • (包装:奥莱恩核糖体、双附件、摆动)
  • 如果您想直接体验我的问题,而不需要复杂的项目设置,您可以下载Eclipse Juno项目或runnable jar文件:

    如果您希望远离下载,请列出以下情况:

  • 设置GUI结构
  • 为吐温设定要求(无特殊要求)
  • 设置一个线程,该线程使用SwingUtilities.invokeAndWait调用名为update()的函数
  • 每当调用update()时,它都使用Container.setSize()在包含按钮1的JPanel上设置大小更改的动画
  • 非常感谢您对这个问题的任何帮助!谢谢:)


    另外,如果这个问题有重复的话,我很抱歉。我在谷歌上搜索了很多次,但我找不到任何与我的问题相关的东西。

    我想在你的
    update()
    方法中说,你应该更改按钮1的首选大小,然后调用

    container.revalidate();
    container.repaint();
    
    更改首选大小和
    revalidate()
    更新布局和
    repaint()
    反映了更改

    或者,您可以为按钮1调用
    setSize()
    ,增加宽度,同时减小按钮2的宽度,然后再次调用
    repaint()
    (无需
    revalidate()
    ,因为重新验证将恢复原始布局)