0

GridBagLayoutをグローバルに初期化してから、クラスコンストラクターでインスタンス化し、いくつかのボタンなどを追加しました。

事後にどうすれば追加できますか?単純なクラスはJFrameを拡張します。事後にclass.add(stuff、gridbagconstraints)を試すと(コンストラクターでadd(stuff、gribagconstraints)だけを使用)、何も起こらず、レイアウトに何も追加されません。

レイアウトマネージャーなどを「更新」する必要がありますか?グローバルに宣言されています。

更新:revalidate()を試しましたが、機能していないようです。概念実証用のテストボタンが配置されたコードの簡略版を次に示します。

public class MainGUI extends JPanel{
    static GridBagConstraints c;
    static MainGUI mainGUIclass;
    static JFrame mainGUIframe;

    public MainGUI() {
    this.setLayout(new GridBagLayout());
    c = new GridBagConstraints();

    saveButton = new JButton("Save and Exit");
    saveButton.setPreferredSize(new Dimension(200, 30));

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 4;
    add(saveButton, c);
    }

public static void main(String[] args) {
    mainGUIframe = new JFrame("Message");

    mainGUIframe.setSize(800,800);

    mainGUIclass = new MainGUI();

    mainGUIframe.add(mainGUIclass);
    mainGUIframe.setVisible(true);


   //now the addition
    JButton newButton = new JButton("New Button");  

    newButton.setPreferredSize(new Dimension(200, 30));


    c.gridx = 5;
    c.gridy = 0;
    c.gridwidth = 4;
    mainGUIclass.add(newButton,c);

    //none of this seems to work
    mainGUIclass.revalidate();//?
    mainGUIclass.repaint();//?

  }
}

Update2:これは、Javaのpassbyvalueの性質と、レイアウトに追加しようとしている別のクラス(キャンバス)の問題のようです。解決策が見つかったら更新します。

Update3:これはスレッドの問題です。呼び出しているクラスがメインウィンドウをハングさせています。

編集:私は参照としてコードを提供し、それ自体で簡単にコンパイルするのではなく、完全な全体像を提供するために完全にしようとしました。あなたの援助を提供してくれたすべての人に感謝します。

Update4:成功!彼らの重要な点は、メディアプレーヤークラスが「isDisplayable()」チェックを実行したことです。これにより、追加されたフレームがgridbaglayoutに追加されなかった場合、プログラムがハングしました。(JInternalFramesの)値による一連の不幸な見た目の通過、gridbaglayoutへの内部フレームの事前追加、および別のメソッドからのメディアのリモート開始により、私が探しているものが機能します。

4

2 に答える 2

4

revalidate()レイアウトを使用して、レイアウトに含まれるコンポーネントをリセットさせるコンテナ(JPanelなどのJComponentから派生している場合)を呼び出します。これは、このレイアウトによって保持されているすべてのコンテナーを介して繰り返され、コンポーネントのレイアウトも更新されている必要があります。私が知っているこれの主な例外は、JScrollPanesに保持されているコンポーネントであり、そのためには、スクロールペインのJViewportでrevalidateを呼び出す必要があります。

また、特にコンテナに保持されているコンポーネントを削除した場合は、repaint()後で呼び出す必要がある場合があります。revalidate()

于 2011-09-07T16:35:47.123 に答える
3

あなたの例ではGridBagConstraints、前のボタンとまったく同じボタンを追加しています。そのコードを実行しようとすると、ボタンが互いに重なり合っているため、そのうちの1つだけが表示されます。GridBagConstraints追加する2番目のボタンが別の場所に配置されるように変更してみてください。GridBagConstraintsこのようなプログラミングエラーが発生する可能性を排除するために、制約されたコンポーネントごとに新しいインスタンスを作成することをお勧めします。

また、アップデートに関してJFrameは、機能がありませんrevalidate()

まだ読んでいない場合は、これをよく読んでおく価値があります

于 2011-09-07T17:10:03.253 に答える