1

カスタムのスクロール可能なJComponentをJFrameに追加しようとしています。

JScrollPane sp = new JScrollPane(hg);
frame.getContentPane().add(sp, BorderLayout.CENTER);

hgは私のカスタムコンポーネントです。

問題は、カスタムコンポーネントが表示されないことです。ただし、これを行うと:

hg.setBounds(0, 0, 800, 600);

その後、表示されます。しかしもちろん、サイズを明示的に設定したくはありません。フレームの中央に収まるようにしたい。

カスタムJComponentクラスで、getPreferredSize()をオーバーライドします。

private Dimension computePreferredSize() {
    return new Dimension((int) (this.getParent().getSize().width * scale),
            (int) (this.getParent().getSize().height * scale));
}

public Dimension getPreferredSize() {
    Dimension d = computePreferredSize();
    System.out.println("Dimension: " + d); // prints reasonable output: Dimension: java.awt.Dimension[width=1201,height=805]
    return d;
}

しかし、これは何の効果もないようです。固定寸法を直接返す場合でも:

public Dimension getPreferredSize() {
    return new Dimension(800, 600);
}

これも機能しません。

ComponentUIのpaint()メソッドにもprintlnを追加しましたが、何も出力されないので、何らかの理由でpaint()が呼び出されていないと思います。その理由は、カスタムコンポーネントのサイズがデフォルトでゼロになっているためだと思います。また、カスタムコンポーネントに独自のサイズを調整させる方法がわかりません。

だから私の質問は、なぜ私のJComponentがデフォルトで表示されないのか、そしてそれをJFrameの中央に自動的に合わせるために何をすべきかということです。

ありがとうございました!

4

1 に答える 1

4

を定義するクラスで、コンポーネントの優先サイズを返すようhgにオーバーライドします。getPreferredSize()例はここここにあります。ここでは、理論的根拠といくつかの重要な注意事項について説明します

于 2012-12-02T03:59:46.847 に答える