5

私は親戚のためのシンプルな小さなスイング アプリケーションに取り組んでいますが、アニメーションを実装するのに問題があります...

ここに私のレイアウトの説明があります:

メイン ウィンドウがあります (JFrame のインスタンス化、パッキング、および表示によって作成されます)。メイン ウィンドウのコンテンツ パネルに、GridBagLayout をレイアウトとして使用するように指示しました。私のグリッドは幅が 2 グリッド、高さが 3 グリッドです。最初の列には 3 つの JButton (A、B、および C) があり、それぞれが垂直グリッド スペースの 1 行と水平グリッド スペースの 1 列を占めています。2 番目の列には、幅 1 列、高さ 3 行の別の JPanel があります。

この 2 番目の JPanel も、レイアウトとして GridBagLayout を使用するように設定されています。この場合、2 つの列と 1 つの行があります。左の列には、幅 1 列、高さ 1 行の JPanel があり、その中にボタン 1 があります。右側の列は、幅が 1 列、高さが 1 行の 1 つの JButton (ボタン 2) だけで構成されています。

以下は、今説明した内容のスクリーンショットです。 レイアウトイメージ

レイアウトが何であるかを理解したので、私が何をしようとしているのかを説明しましょう。

ボタン 1 を含む Jpanel のサイズを変更するためにUniversal Tween Engineを使用しようとしましたが、結果として次のようになりました。

ここに画像の説明を入力

ご覧のとおり、ボタン 1 を含む JPanel のサイズが正常に変更されました。しかし、ボタン 2 のサイズと位置はまったく変更されておらず、実際、ボタン 2 はボタン 1 を含む JPanel によって切り取られています。

ボタン 1 を含む JPanel のサイズを変更して、それを含む GridBagLayout のセル サイズを同時に変更することを期待していたので、これは問題です。この件に関しては、私はひどく誤解していたようです。

それが私の質問になります... GridBagLayout を「更新」して、ボタン 1 を含む Jpanel からのサイズの増加に対応するようにグリッドのサイズを変更するにはどうすればよいですか? GridBagLayout.invalidatelayout()GridBaglayout で呼び出しを試み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"));
    }
}

自分でコードをコンパイルする場合は、次の 3 つのリソースが必要になります。

  1. Universal Tween Engine ライブラリ jar
  2. DrawingCanvas.java (パッケージ aurelienribon.utils.swing)
  3. ComponentAccessor.java (パッケージ aurelienribon.tweenaccessors.swing)

複雑なプロジェクトのセットアップを行わずに、私の問題を直接体験したい場合は、Eclipse Juno プロジェクトまたは実行可能な jar ファイルをダウンロードできます。

ダウンロードを避けたい場合は、何が起こっているかのリストを次に示します。

  1. GUI 構造のセットアップ
  2. トゥイーンの要件を設定します (特別なことは何もありません)
  3. SwingUtilities.invokeAndWait を使用して update() という関数を呼び出すスレッドをセットアップします。
  4. update() が呼び出されるたびに、Container.setSize() を使用して、ボタン 1 を含む JPanel のサイズ変更をアニメーション化します。

この問題に関するヘルプは大歓迎です! ありがとうございました :)

PS この質問と重複していたら、大変申し訳ありません。私はかなりグーグルで調べましたが、私の問題に関連するものさえ見つけることができませんでした.

4

1 に答える 1