2017-03-21 3 views
1

私は、に特化することを避けてLayoutManagerののContainerのデフォルトのレイアウトを利用したいと思っています。LayoutManagerを使用しているときに、これらのウィジェットがフレームに表示されないのはなぜですか?

だから私はこのコードを書いた:

LayoutManager layout_manager = this.getContentPane().getLayout(); 
layout_manager.addLayoutComponent(null, text_field_add_items); 

(NB:thisJFrameオブジェクトを指し、text_field_add_items私はサイズにsetSizeのおかげで、指定されたためTextFieldです)

をしかし、何も表示されません。

¹:私が実際にLayoutManagerを使用したいのは、デフォルトのもの(FlowLayout)よりも別のレイアウトを使うことができるからです。 あなたはその理由を知っていますか?


全体源:FlowLayoutためJavaDocにおいて

package tp4.bundle_clients; 

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import java.awt.LayoutManager; 
import javax.swing.WindowConstants; 

public class Gui extends JFrame { 

    public Gui() { 
     this.setTitle("Client's graphical interface"); 
     this.setSize(500, 250); 
     this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     this.addWidgets(); 
     this.setVisible(true); 
    } 

    private void addWidgets() { 

     JTextField text_field_add_items = new JTextField(); 
     text_field_add_items.setSize(100, 100); 

     JButton button_add_items = new JButton("Add items"); 
     button_add_items.setSize(100, 100); 

     JTextField text_field_remove_items = new JTextField(); 
     JButton button_remove_items = new JButton("Remove items"); 

     JButton button_display_storage = new JButton("Display storage"); 

     LayoutManager layout_manager = this.getContentPane().getLayout(); 
     layout_manager.addLayoutComponent(null, text_field_add_items); 
     layout_manager.addLayoutComponent(null, button_add_items); 

    } 


} 
+0

はあなたがそれを行うする全体の方法を投稿することができます呼び出す変更します'JFrame'の作成を含む? – ostrichofevil

+0

私の投稿を編集しました! –

+0

さて、あなたのレイアウトは実際には 'BorderLayout'です。これはデフォルトです。それがうまくいかない理由について私の答えに編集を参照してください。 – ostrichofevil

答えて

1

次のように、addLayoutComponentの説明を読み取り:

は、指定されたコンポーネントをレイアウトに追加します。 このクラスでは使用されていません。 LayoutManagerが異なっていた場合

あなたのコードでは、働いているかもしれませんが、FlowLayoutと、何も起こりません。

残念ながら、あなたが実際に使用している特定のLayoutManagerでコードする必要があります。 ,addLayoutComponentなどを使用してください。つまり、コードを壊さずにLayoutManagerを簡単に変更できるように、レイアウトコードを別のメソッドまたはクラスに委任することをお勧めします。

EDIT: camickrで指摘したように、デフォルトLayoutManagerBorderLayoutです。境界線レイアウトでは、addLayoutComponentを使用するときに制約を使用する必要があります。 JavaDocを参照してください。それは私が(FlowLayoutのある)デフォルト以外のレイアウトを使用できるようになりますので、私は本当にのLayoutManagerを使用したいと思う

1

たJFrameのコンテンツ・ペインのデフォルトのレイアウトマネージャFlowLayoutではなく、BorderLayoutです。

LayoutManagerを使用すると、レイアウトマネージャが適切に使用できるように、パネルのレイアウトマネージャが何であるかを知る必要があるため意味がありません。多くのレイアウトマネージャは、コンポーネントをパネルに追加するときに「制約」を使用する必要があります。

FlowLayout、GridLayout、BoxLayoutなどの単純なレイアウトマネージャのみが、制約なしでコンポーネントを追加できます。

私の提案では、LayoutManagerまたはaddLayoutComponent(...)メソッドを使用しないでください。必要に応じて、適切な制約を加えてパネルにコンポーネントを追加するだけです。コードを理解して維持しやすくします。

1

LayoutManagerメソッドを直接呼び出すべきではありません。それらは、子をレイアウトするためにContainerクラスによって使用されます。

あなたは次のようにコンポーネントを追加する必要があります:あなたが将来的に別のレイアウトを使用する必要があります場合は

this.getContentPane().add(text_field_add_items); 

はちょうどそれが

this.setLayout(newLayout); 
関連する問題