2013-01-14 16 views
5

これは私の最初の投稿です。私が何か間違っている場合は、私に許してください。JPanelに追加したときにJava Swing Componentsのサイズが正しくない

私の問題がある:サイズ等のために、私は定義された値とのJPanelにコンポーネントを追加しようとしています

しかし、私は、パネルに追加するとき、彼らは絶対に彼らが持つべきサイズと位置を持っていません。たとえば :私は、アプリケーションを起動すると、両方のJTextAreaの年代は本当に小さくてどこか途中で(ない上記のように設定)されている

public class Console extends JFrame { 
    private JPanel mainPanel = new JPanel(); 
    private JTextArea textField = new JTextArea(); 
    private JTextArea textField2 = new JTextArea(); 

    public Console() { 
     this.setSize(500,300); 

     this.mainPanel.setSize(this.getWidth(),this.getHeight()); 

     this.textField.setEditable(false); 
     this.textField.setSize(this.mainPanel.getWidth(), 100); 
     this.textField.setPreferredSize(new Dimension(this.mainPanel.getWidth(),this.mainPanel.getHeight())); 
     this.textField.setLocation(0, 0); 
     this.textField.setText("some text"); 
     this.textField.setVisible(true); 

     this.textField2.setSize(this.mainPanel.getWidth(),200); 
     this.textField2.setPreferredSize(new Dimension(this.getWidth(),this.getHeight())); 
     this.textField2.setLocation(0,this.mainPanel.getHeight()-this.textField.getHeight()); 
     this.textField2.setText("blabla"); 
     this.textField2.setVisible(true); 

     this.mainPanel.add(textField); 
     this.mainPanel.add(textField2); 
     this.mainPanel.setVisible(true); 

     this.add(this.mainPanel); 
     // I know you should not call setVisible() in the Constructor, just for making Code more simple here. 
     this.setVisible(true); 
    } 
} 

mainPanelがcorrect.IはのsetSize()とsetPreferredSizeを呼び出ししようとしながら、()コード内のさまざまな場所では動作しませんでしたが、動作しませんでした。私が聞いた限りこれを行うためにLayoutManagerを使用する方が良いことは分かっていますが、正直言って、正しく使用する方法はありません。 Oracle Doc'sでチェックしましたが、誰かがこのためにクリーンなソリューションを投稿できると感謝しています。

+0

あなたは正しい「レイアウト」を使用する必要があります –

+0

残念ですが、残念ですが、setLayout()を意味しますか?もしそうなら、私は、例えば、GridLayoutを作成しなければならないと思います。しかし、私はこのレイアウトにコンポーネントを追加する必要がありますか、それはどのように機能しますか? –

+0

回答として私のガイドラインを参照してください。 –

答えて

6

はあなたのContainerのための適切なLayoutを設定する必要があります。あなたはのようなコンテナの場合はsetLayoutJPanelのようになります。他のコンポーネントをレイアウトに追加するのではなく、コンテナに追加します。そうすればそれに応じてレイアウトされます。それはどのように動作するのですか?

適切なレイアウトでは、setLocation()に電話する必要はありません。また、setVisible(true)は過剰です。trueはコード内のこれらのコンポーネントのデフォルト値です。

JFrameを拡張しないでください。代わりにJPanelを拡張してJFrameに追加してください。

EDTについては、SwingUtilities.invoketLater()をご利用ください。

また、this.と入力するのではなく、いくつかのバイトを保存することもできます。

+0

SwingUtilities.invoketLater()を検索し、JPanelがデフォルトでFlowLayoutを使用していることを知りました:)。ありがとうございました –

+0

* "いつも" this.'を入力するのではなく、いくつかのバイトを節約することもできます。*自動完成IDEを使用すると実際には*キーストロークを保存できるということは皮肉ですメソッド名のリストがポップされます。 ;)あなたの答えは+1、 –

+1

@AndrewThompson、はい、ちょっと皮肉です。私はEclipseでCtlr + Spaceを押してメソッドとフィールドのリストを 'this 'とタイプすることなく見ることができると思います。 –

2

レイアウトについては、すべてSwing layoutです。あなたのJTextArea問題、使用のために

+0

あなたとNikolayのおかげで、私は再びそれをチェックアウトします。 Oracle Docsでどこか読んで間違って読んで、それを実現しました^^。ごめんなさい。 –

2

 JTextArea j=new JTextArea(); 
     j.setColumns(20); 
     j.setRows(5); 

変更setColumns()setRows()の値が大きさを変化させます。 +約提案はLayout Managersです。この作品

希望;)

+0

+1、または適切な[コンストラクタ]を使用して 'JTextArea'を初期化します(http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html#JTextArea(int、 %20int))。 'JPanel'はデフォルトで' FlowLayout'を持っているので、レイアウトはこれとは関係ありません。ちょうどあなたの答えが手元の問題に関連して適切すぎます。 –

+0

@GagandeepBaliよろしくお願いします。 –

+0

ありがとうございます:)。 –

-1

jpanelの絶対レイアウトを試してみてください。

+0

絶対レイアウトとは何ですか?以前は聞いたことがありません。絶対配置を参照する場合は、最初に[絶対配置]の最初の段落(http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html)を読んでみる必要があります。 ** Java Docs **はこのことに関して、可能な限りあなた自身でそれを使用することを禁じています。 –

+1

-1これは最悪のアドバイスです。ほとんど絶対レイアウトを使うべきではありません。 –

関連する問題