2011-07-24 13 views
1

私は最終的にカスタムボタンを作るためにクラスを拡張しようとしています。私は(?より良い多型)が階層構造上可能な限り高い拡張することが最善ですいくつかの場所で読んで、私はJComponentを拡張しようとしている:Java Swing - なぜJComponentが表示されないのですか?

import javax.swing.*; 
import java.awt.*; 

public class TestButton extends JComponent { 
    private static final long serialVersionUID = 1L; 


    public TestButton() { 
     super();   
    } 

} 

そして、これを呼び出すコードは、次のとおりです。

b1 = new TestButton();  
basePanel.add(b1,gbc); // (gbc is GridBagConstraints object) 

私のレイアウトには、私のJComponentは表示されません。クラスをJButtonとして拡張しても問題はありません。どうしたんだ?

更新:

FYI、これは私が明らかにここに遠く堪能からだ、noobの概念的な問題の一種です。

ここに説明する写真があります。変更されたのはextends ______です。

何が起こるべきかは、紫色で塗りつぶされたブロックで、底部の黄色のブロックと同じ高さです。

何が起こっているのかは、背景がないデフォルトサイズのブロックです(黒はJFrameからのものです)。

enter image description here

+1

のhttp:// WWWを.swingexplorer.com /は、このような問題をデバッグするときに使用するのに適したツールです。 – sbridges

答えて

2

これは空白のコンポーネント(基本的にはテンプレート)です。プロパティはありません。 paintComponentメソッドをオーバーライドして独自のグラフィカル要素を追加してから、updateメソッドをオーバーライドして論理要素を追加する必要があります。

+0

Ahhh ok。 JComponentは自動的にグリッドバッグセルを埋めますか? (...制約が両方ともに設定されていれば... ...)オブジェクトには塗りつぶし動作があります。 – Ben

+1

'update()'をオーバーライドする必要はありません。 – trashgod

+0

trashgodに同意します - Swingでの更新の上書きを推奨していません。 -1 –

3

あなたはJComponentをすることになっている場所で見るために何を期待していますか? JButtonを拡張すると、すべてのグラフィックが表示されますが、空のコンポーネントは何も作成されていません。コンポーネントに何かを入れてみてください(JLabelなど)

+0

私が期待していたのはJPanelに似た、ブロックされた領域でした。バックグラウンドを設定してそれにスティックを入れることはできましたが、それは事実ではありません:)チップに感謝します。 、いくつかの中に戻る。 – Ben

+0

OK、ボタンを押してください。ただし、結果は期待できません(説明するのは難しい)。JComponentは自動的にグリッドバッグセルを埋めますか? (制約は 'BOTH'に設定されています) – Ben

3

JButtonの機能を使用するには、まだJButtonを拡張する必要があります。そうでなければ、誰もがObjectを拡張してすべてを期待することができます。

+0

私は必ずJButton(まだ)をしたくありません、私はちょうど私のレイアウトセルを埋めるためにバックグラウンドを持つブロックを望んでいます... JComponentはすでに' setBackground'メソッドを持っています。 – Ben

4

JComponentとそのサブクラスの主な違いの1つは、後者にはUIデリゲートがあり、JComponentにはない点です。 setBackground() "という色は、コンポーネントが不透明で、サブクラスがJComponentまたはComponentUI実装の場合にのみ使用されることに注意してください。結果として、このプロパティを守るためには、paintComponent()を上書きする必要があります。

+0

+1それは謎の半分であり、かなりクリアです。グリッドバッグのセルがいっぱいにならない理由は何ですか? – Ben

+0

申し訳ありません、私は 'GridBagLayout'の人ではありませんが、私はあなたの選択したL&Fの' PanelUI'で何かを推測しています。 [sscce](http://sscce.org/)は光を放つかもしれません。 – trashgod

0

どちらかそのままのJButtonを使用します。

JButton b1 = new JButton("Enter JButton text here");  
basePanel.add(b1,gbc); 

かのJButtonクラスを拡張し、あなたが特定のプロパティを変更し、あなた自身の好みに合わせてカスタマイズしたい場合:

public class TestButton extends JButton { 
    private static final long serialVersionUID = 1L; 


    public TestButton(String buttonText) 
    { 
     super(buttonText);   
    } 

} 
関連する問題