2009-05-02 5 views
6

私は、プログラムのロード、アプリケーションのロードが完了した後、JPanelをプログラムで作成し、サイズを決めて配置するコードを引っ張る場所を探しています。アプリケーションの起動が完了したら、どのJava Swingイベントを使用して知ることができますか?

私はちょうどJavaで始まっています。私はjdk1.6.0_13でNetBeans 6.5.1を使用しています。私は新しいプロジェクトウィザードを使って基本的なJava/Swingデスクトップアプリケーションを作成しました。これは、すべてのUI要素が配置されている中央のJPanelでFrameViewを使用するSingleFrameApplicationです。

FrameViewコンストラクタで初めてコードを試しましたが、UIに追加したデザインタイムコントロールの境界矩形に基づいてJPanelを配置しようとすると、そのコントロールはまだ配置されずにサイズが調整されています私は座標のすべてのゼロを得ています。

アプリケーションがロードされた後にclickイベントからコードを呼び出すことで、コードが正常に動作することを確認しました。問題がすべてのサイズの整理が完了した時点を知る方法を見つけています。

また、メインのJPanelからcomponentShownイベントを試しましたが、通常のアプリケーションの起動時に明らかに発生しないsetVisibleが明示的に呼び出された場合にのみ呼び出されます。

誰でもいくつかのポインタを提供できますか?ありがとう。

アップデート:私は以下の私の答えに言及するものに加えて

、私はまたApplication.ready()メソッドについて読みます。これはまた、アプリケーションのUI部分がいつ実行する必要があるかを完了した時点を知るための重要な時点でもあります。アプリケーションからの私の見解へのやりとりはちょっと面倒だったようです。

答えて

4

私が行った解決策は、実際にはチャールズ・マリンとJRLの回答を組み合わせたものでした(私はあなたの両方の回答をクレジットのためにアップしました、ありがとう)。

私のFrameViewクラスは、WindowListenerを実装していました。

... 
public class MyView extends FrameView implements WindowListener 
... 

私のFrameViewコンストラクタでは、アプリケーションのメインフレームにリスナーを追加しました。

... 
getFrame().addWindowListener((WindowListener) this); 
... 

は、その後のwindowActivatedの私の実装では、私は他のコントロールの位置とサイズに基づいて、主JPanelの上のコントロールを配置し、そのサイズをしていたコードを呼び出すことができます。

public void windowActivated(WindowEvent e) 
{ 
    // The application should now be finished doing its startup stuff. 
    // Position and size a control based on other UI controls here 
} 
+0

+1 – Freak

3

I と思っています。あなたはWindowActivatedしてください。 this part of the tutorialをご覧ください。

+0

windowActivatedはフレームまたはダイアログの方法のようです。 SingleFrameApplication、FrameView、メインのJPanelにアクセスできます。それらのどれもフレームまたはダイアログではありません。 –

+0

+1:私は、最終的にwindowActivatedイベントを取得する方法を見つけ出すことができました。ありがとう。 –

1

私は、これはWYSIWYGエディタの事であると仮定しgetFrame().isValid()

+0

それは良いと思うけど、どこから呼び出すのか分かっていれば、コードをどこに置くのか分かります:) –

+0

メソッドがtrueを返すまで別のタスクを実行してから、サイズ変更。 FrameViewコンストラクタ内からタスクを開始することができます。 – JRL

+0

+1:getFame()は、windowActivatedイベントにフックするために必要なJFrameを取得するための鍵でした。ありがとうございました。 –

1

を使用して試してみました。私はNetBeans 6.1を見ているので、あなたの経験は変わるかもしれません。

スイングコンポーネントをレイアウトする従来の方法は、LayoutManager(またはLayoutManager2)を使用しています。 NetBeansのヘルプによれば、ビジュアルエディタは制約をサポートする必要がない限り、これらをサポートします。 -

  1. 新しいJavaBeansを作成し、それがLayoutManagerのを実装しています(右クリックBeanクラスをずつを作成することができたBeanInfoがパレットをサポートするために、あまりにも必要):

    手順は、次のようなものになります

  2. プロジェクト
  3. Beanを右クリックし、パレットに追加ツール>を選択...
  4. それを追加右クリックし、[レイアウトやセレクを設定するパネルを構築トンセットのレイアウト>あなたのBean名

あなたはやや欠けているデザイン時の経験を見つけることができます。

サンプルレイアウトの実装:

public class StepLayoutBean extends Object implements Serializable, LayoutManager { 

    public void addLayoutComponent(String name, Component component) { 
    } 

    public void layoutContainer(Container container) { 
     Dimension space = container.getSize(); 
     int xoffset = 0; 
     int yoffset = 0; 
     for (Component kid : container.getComponents()) { 
      Dimension prefSize = kid.getPreferredSize(); 
      if (prefSize.width + xoffset > space.width) { 
       xoffset = 0; 
      } 
      Rectangle bounds = new Rectangle(xoffset, yoffset, prefSize.width, prefSize.height); 
      kid.setBounds(bounds); 
      xoffset += prefSize.width; 
      yoffset += prefSize.height; 
     } 
    } 

    public Dimension minimumLayoutSize(Container container) { 
     Dimension size = new Dimension(); 
     for (Component kid : container.getComponents()) { 
      Dimension minSize = kid.getMinimumSize(); 
      size.width = minSize.width > size.width ? minSize.width : size.width; 
      size.height += minSize.height; 
     } 
     return size; 
    } 

    public Dimension preferredLayoutSize(Container container) { 
     Dimension size = new Dimension(); 
     for (Component kid : container.getComponents()) { 
      Dimension prefSize = kid.getPreferredSize(); 
      size.width += prefSize.width; 
      size.height += prefSize.height; 
     } 
     return size; 
    } 

    public void removeLayoutComponent(Component component) { 
    } 
} 

カスタムレイアウトは、法案に適合しない場合は、コンポーネントのプロパティパネルの下のイベントのバインディングを見ている - そのようにリサイズすると、一部のレシピかもしれませんが再帰的なイベントの嵐の種類。

+0

+1:私は最後に確信しています、これは行く方法です。私は本当にアプリケーションフレームワークのライフサイクルを理解することにも関心がありました。ありがとう。詳細な回答は –

関連する問題