2

JComponentに奇妙な問題があります。独自のJComponentを作成しようとしているので、JComponentを一緒に作成する必要があります。

JComponentJDialでJButtonをペイントしたかったのです。

public class JDial extends JComponent {
    private static final long serialVersionUID = 3364481508702147328L;

    public JDial() {        
        JButton b = new JButton("test");
        this.add(b);
    }
}   

しかし、それは何もペイントしません。さらに興味深いのは、これがうまく機能することです。

public class JDial extends JPanel {
    private static final long serialVersionUID = 3364481508702147328L;

    public JDial() {        
        JButton b = new JButton("test");
        this.add(b);
    }
}

JPanelはJComponentを継承し、内部にJButtonをペイントします。JPanelはこの魔法をどのように行いますか?

前もって感謝します

4

2 に答える 2

5

通常、paintComponent()メソッドをオーバーライドしてカスタムペイントを実行する場合は、JComponentを拡張します。

多数のコンポーネントを追加するだけの場合は、JPanelを使用する必要があります。

2つの違いは、JPanelはデフォルトでFlowLayoutを使用するため、追加されたコンポーネントのレイアウト方法を知っていることです。JComponentをJPanelのようにするには、レイアウトマネージャーを設定し、カスタムペイントを追加して背景をペイントする必要があります。

于 2013-03-23T21:17:10.873 に答える
1

JComponentも子孫であり、適切なサイズと位置の子を再描画するためのすべてのコードをContainer備えていますが、サイズ変更やレイアウトを行う機能はありません。また、サイズも場所も設定しないためJButton、デフォルトではサイズはゼロと見なされます。

これとは異なり、デフォルトでJPanel作成さFlowLayoutれるこのレイアウトマネージャーは、主に計算された優先サイズに応じてコンポーネントサイズを設定します。JComponent一般的に、コンテナとして直接使用することは珍しく、を使用しますJPanel

于 2013-03-23T21:15:56.647 に答える