java设置网格布局面板大小设置_Java Swing GridBagLayout面板调整大小问题

本文描述了在Java Swing中使用GridBagLayout时遇到的问题,即通过Universal Tween Engine调整一个JPanel大小后,其内部GridBagLayout单元格大小未能相应更新,导致其他组件显示异常。作者分享了代码示例,寻求解决方案。

我正在为一个亲戚制作一个简单的小摆动应用程序,但是我在实现它的动画时遇到了麻烦……

这是我的布局的描述:

我有一个主窗口(通过实例化,打包和显示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, 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"));

}

}

如果您想自己编译代码,则需要以下三种资源:

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

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

>设置GUI结构

>设置补间的要求(没什么特别的)

>设置一个使用SwingUtilities.invokeAndWait调用名为update()的函数的线程

>每当调用update()时,它都使用Container.setSize()来为包含Button 1的JPanel上的大小更改设置动画.

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值