2013-03-06 90 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(),因爲重新確認將恢復原來的佈局)。