2013-03-06 100 views
5

我对一个相对简单的小Swing应用程序的工作的问题,但我在实施它的动画麻烦......的Java Swing的GridBagLayout面板调整

这里是我的布局的描述:

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

第二个JPanel也设置为使用GridBagLayout作为其布局。在这种情况下,有两列和一行。左列有一列宽,一列高的JPanel,里面有按钮1。右列包含一个JButton(按钮2),它也是一列宽,一列高。

这里是什么,我刚才谈到的截图: Image of Layout

现在你明白的布局是什么,让我解释什么,我一直在努力做的事情:

我一直在努力使用Universal Tween Engine来调整其中包含按钮1.然而,在我尝试JPanel中,我得到这样的结果:

enter image description here

正如你大概可以看到,包含按钮1的JPanel已成功调整大小!但是,按钮2的大小和位置根本没有改变,事实上,按钮2被包含按钮1的JPanel切断!

这是一个问题,因为我期望调整包含按钮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")); 
    } 
} 

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

  1. Universal Tween Engine library jar
  2. DrawingCanvas.java(package aurelienribon.utils.swing)
  3. ComponentAccessor.java(package aurelienribon.tweenaccessors。摆动)

如果你想体验一下我的问题的第一手资料,无需复杂的项目设置,您可以下载Eclipse朱诺项目,或可运行jar文件:

如果你宁愿留从下载了,这里是发生了什么事情的清单:

  1. 设置GUI结构
  2. 吐温没什么特别的设置要求
  3. 设置使用SwingUtilities.invokeAndWait调用()称为更新功能的线程
  4. 每当更新()被调用时,它使用Container.setSize()来激活包含按钮1的JPanel上的大小更改。

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

P.S.如果这个问题有重复,我很抱歉。我搜索了很多,但我无法找到任何与我的问题有关的事情。

回答

3

我会说你update()方法,你应该改变的Button1首选大小和调用

container.revalidate(); 
container.repaint(); 

更改首选大小和revalidate()更新布局和repaint()反映所做的更改。

另外,您可以拨打setSize()为Button1增加宽度和Button2的同时降低幅度并再次调用repaint()(不revalidate(),因为重新确认将恢复原来的布局)。