我對一個相對簡單的小Swing應用程序的工作的問題,但我在實施它的動畫麻煩......的Java Swing的GridBagLayout面板調整
這裏是我的佈局的描述:
我有一個主窗口(通過實例化,打包和顯示JFrame創建)。 我已經告訴主窗口的內容面板使用GridBagLayout作爲它的佈局。 我的網格是2格寬,3格高。在第一列中,我有三個JButton(A,B和C),每個佔據一行垂直網格空間,一列水平網格空間。在第二列中,我有另一個JPanel,它是一列寬,三列高。
第二個JPanel也設置爲使用GridBagLayout作爲其佈局。在這種情況下,有兩列和一行。左列有一列寬,一列高的JPanel,裏面有按鈕1。右列包含一個JButton(按鈕2),它也是一列寬,一列高。
這裏是什麼,我剛纔談到的截圖:
現在你明白的佈局是什麼,讓我解釋什麼,我一直在努力做的事情:
我一直在努力使用Universal Tween Engine來調整其中包含按鈕1.然而,在我嘗試JPanel中,我得到這樣的結果:
正如你大概可以看到,包含按鈕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"));
}
}
如果你想自己編譯代碼,你需要以下三種資源:
- Universal Tween Engine library jar
- DrawingCanvas.java(package aurelienribon.utils.swing)
- ComponentAccessor.java(package aurelienribon.tweenaccessors。擺動)
如果你想體驗一下我的問題的第一手資料,無需複雜的項目設置,您可以下載Eclipse朱諾項目,或可運行jar文件:
如果你寧願留從下載了,這裏是發生了什麼事情的清單:
- 設置GUI結構
- 吐溫沒什麼特別的設置要求
- 設置使用SwingUtilities.invokeAndWait調用()稱爲更新功能的線程
- 每當更新()被調用時,它使用Container.setSize()來激活包含按鈕1的JPanel上的大小更改。
任何有關此問題的幫助都將非常感謝! Thankyou :)
P.S.如果這個問題有重複,我很抱歉。我搜索了很多,但我無法找到任何與我的問題有關的事情。