加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Swing GridBagLayout面板调整大小问题

发布时间:2020-12-14 19:34:24 所属栏目:Java 来源:网络整理
导读:我正在为一个亲戚制作一个简单的小摆动应用程序,但是我在实现它的动画时遇到了麻烦…… 这是我的布局的描述: 我有一个主窗口(通过实例化,打包和显示JFrame创建). 我告诉主窗口的内容面板使用GridBagLayout作为其布局. 我的网格宽2格,高3格.在第一列中,我有
我正在为一个亲戚制作一个简单的小摆动应用程序,但是我在实现它的动画时遇到了麻烦……

这是我的布局的描述:

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

第二个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
> DrawingCanvas.java(包aurelienribon.utils.swing)
> ComponentAccessor.java(包aurelienribon.tweenaccessors.swing)

如果您想亲自体验我的问题,无需复杂的项目设置,您可以下载Eclipse Juno项目或runnable jar文件:

> Imaffect Eclipse Juno Project
> Imaffect Runnable Jar File

如果您希望远离下载,请在此列出正在进行的操作:

>设置GUI结构
>设置补间的要求(没什么特别的)
>设置一个使用SwingUtilities.invokeAndWait调用名为update()的函数的线程
>每当调用update()时,它都使用Container.setSize()来为包含Button 1的JPanel上的大小更改设置动画.

非常感谢任何有关此问题的帮助!谢谢 :)

附:如果这个问题有重复,我很抱歉.我搜索了很多,但我找不到任何与我的问题有关的东西.

解决方法

我会在你的update()方法中说你应该改变Button1的首选大小并调用
container.revalidate();
container.repaint();

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

或者,你可以调用setSize()来增加Button1的宽度,同时减小Button2的宽度,然后再调用repaint()(不需要revalidate(),因为revalidation会恢复原始布局).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读