2017-02-08 4 views
1

私はJFrame mainFrameを持つクラスBaseWindowと、mainFrameで動作するメソッドの束を持っています。私のアプリの実際のウィンドウは、BaseWindowを拡張することによって作られています。Eclipse WindowBuilderを継承したJFrameを解析する方法を教えてください。

BaseWindowを継承するクラスはmainFrameを継承しているため、コードを解析するときにウィンドウビルダが「参照」しないようにします。ウィンドウビルダのデザインタブに表示されるのは空のウィンドウですが、コードを実行するとすべて正常に動作します。

このアプローチをウィンドウビルダで動作させるにはどうすればよいですか、または「トリック」ウィンドウビルダを使ってmainFrameを解析しますか?以下は、BaseWindowを拡張したクラスの例です:

package GUIApp; 

//took out the imports to save space 

class SampleWindowOne extends BaseWindow{ 


    public JLabel txtSampleText; 
    public JButton btnMagicButton; 

    public SampleWindowOne() { 
     initialize(); 
    } 

    public void run(){ 
     mainFrame.setBounds(getCenteredBounds()); 
     mainFrame.setVisible(true); 
    } 

    private void initialize() { 

     mainFrame = new JFrame(); 
     mainFrame.setBounds(100,100,700,525); 
     mainFrame.setTitle("Sample Window One"); 
     mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     mainFrame.getContentPane().setLayout(null); 

     txtSampleText = new JLabel(); 
     txtSampleText.setFont(new Font("Dialog", Font.PLAIN, 25)); 
     txtSampleText.setHorizontalAlignment(SwingConstants.CENTER); 
     txtSampleText.setText("Sample Window"); 
     txtSampleText.setBounds(12, 50, 674, 51); 
     mainFrame.getContentPane().add(txtSampleText); 

     JTextArea txtrLoremIpsumDolor = new JTextArea(); 
     txtrLoremIpsumDolor.setEditable(false); 
     txtrLoremIpsumDolor.setFont(new Font("Dialog", Font.PLAIN, 16)); 
     txtrLoremIpsumDolor.setForeground(Color.DARK_GRAY); 
     txtrLoremIpsumDolor.setWrapStyleWord(true); 
     txtrLoremIpsumDolor.setLineWrap(true); 
     txtrLoremIpsumDolor.setText("Lorem ipsum dolor sit amet..."); 
     txtrLoremIpsumDolor.setBounds(57, 131, 609, 296); 
     mainFrame.getContentPane().add(txtrLoremIpsumDolor); 

     btnMagicButton = new JButton("End Program"); 
     btnMagicButton.setEnabled(false); 
     btnMagicButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       requestTerminate(); 
      } 
     }); 
     btnMagicButton.setBounds(257, 451, 175, 25); 
     mainFrame.getContentPane().add(btnMagicButton); 

    } 
} 
+0

'txtrLoremIpsumDolor.setBounds(57,131,609,296);' ?? –

+4

注:私はウィンドウ・ビルダーを使用しませんが、Swingコーディングをたくさん行い、JTextAreaの自然な振る舞いを制限するため、上記の行は決して存在するべきではありません。 JTextAreasはJScrollPanes内に属し、このようにサイズを制限すると、テキスト領域が拡大されないようになります。つまり、スクロールバーは決して動作しません。基本的なライブラリをよりよく理解するまで、Windowsビルダーの使用を断念することをお勧めします。 –

+0

良い情報、ホバークラフト。私はSwingの深い理解から恩恵を受けることは間違いありませんが、現時点ではWYSIWYGの設計機能を再び働かせる必要があります。私は今までに教えられてきたGUIデザインが非常に初歩的で、独占的にウィンドウビルダを使っているクラスのコードを書いていますので、私のグループメンバーと私は現在のプロジェクトでそれを使用できる必要があります。 – jgardner7289

答えて

0

わかりました。私は、ウィンドウビルダを動作させる方法を見つけました!うまくいけば、これは自分のコードで誰かを助け

public SampleWindowOne() { 
    JFrame mainFrame; 
    initialize(); 
} 

public SampleWindowOne() { 
    initialize(); 
} 

へ:私はからコンストラクタを変更しました。

編集:結局のところ、完全に解決されていません。以下を参照してください。私はより良い解決策を見つけたら更新します。

Edit2:いい夜の睡眠の後、解決策はかなり明らかです。私は今クラスの初めに別のJFrameを宣言します。私の代わりに、メインフレームのこのフレームにすべての私の要素を追加して、初期化の終わりに、私は

mainFrame = newFrame; 
+0

Hmm。さらなる実験では、ウィンドウビルダが既存のコードを解析するように見えますが、新しい要素を追加しようとするとクラッシュします。既存のものを変更することができます。まだ完全な解決策ではありません。 – jgardner7289

+2

このコードは 'public SampleWindowOne(){ JFrame mainFrame; initialize(); } 'は、決して初期化されず、コンストラクタの終わりでスコープから外れるローカル変数を宣言します。それは良いことを達成しません。さらに、あなたは「魔法のように」コーディングしているように思えます。 –

+0

私は、コンストラクタの実行が終了した後に変数が有効範​​囲外になることを認識しています。私はその行を挿入することで、ウィンドウビルダーが問題のJFrameを解析できるようになることを「トリックする」と思っていました。クラス内でmainFrameを宣言すると、windowbuilderはinitializeメソッドの解析中にmainFrameを探します。問題は、ウィンドウビルダがJFrameを解析できるようになりましたが、新しい要素を追加できないことです。私の希望は、この特定の設計ツールを経験した人が、自分がやろうとしていることを達成するために適切な方法で体重を測ることができるということでした。 – jgardner7289

1

は、私はあなたが今、それを過ぎていると確信して入れ、これに解決策を探して他の人のために:

Eclipseの

に行く:
ウィンドウ - >設定 - >ウィンドウビルダー(木) - >スイング - >コード生成

    コンボボックス0から
  1. 設定initGUI方法fページの上部にある「新しい文のメソッド名」。 (別のメソッド名を設定することもできます)
  2. 「変数生成」セクションで 3番目のタブに「Init。Field」が表示されます。タブは空の四角形を持つ)。
  3. [OK]をクリックします。

  4. Restart eclipse。

  5. 次のようにinitGUIという名前のメソッドを作成します。コピーそのメソッドへのコンストラクタからすべてコードを

    private void initGUI() { 
    
    } 
    
  6. を。

  7. 呼び出すことを、あなたのコンストラクタからメソッド:「デザイン」をエディタの最下部に:クリックして

    public WindowTest() 
    { 
        initGUI(); 
    } 
    
  8. ゴーウィンドウにビルダーのデザイン。
  9. 必要に応じて多くのリパルスをクリックします。
  10. ウィンドウに1つのコンポーネント(JButtonなど)を追加し、iniGUIメソッドに入ることを確認します。 が発生したことがわかったら、そのメソッドからGUIにリアルタイムされていないコード行を取り出し、必要に応じてコンストラクタに入れても安全です。
関連する問題