1

私はSwingで遊んでいて、本当に単純なSwingコンポーネントに取り組んでいます。クラスから継承されたコンポーネントと。JComponentから継承されたUIがありComponentUIます。メソッドは次のpaint()ようになります。

public void paint(Graphics g, JComponent c) {
    int x = c.getX();
    int y = c.getY();
    c.setBounds(x, y, 100, 25);
    int width = c.getWidth();
    int height = c.getHeight();
    Rectangle r = g.getClipBounds();
    g.fillRect(0, 0, 10, 10);
    g.drawString("Baf!", 3, 3);
}

ただし、1以外の値を取得することは完全に不可能r.heightです。コンポーネントは指定された幅ですが、高さは常に1ポイントのみです。他の誰かがそのようなコンポーネントを経験したことがありますか?残念ながら、簡単なチュートリアルはありません。すべてのチュートリアルは理解できないほど複雑です(または時代遅れです)。

レイアウトマネージャーは、このコンポーネントのサイズを常に1の高さに変更しているようです(最小値に関係なく)。

4

2 に答える 2

5

コードにはいくつかの問題があります。

JComponentを拡張するクラスに関係するもの:

  1. public void paint(Graphics g, JComponent c) {}

    は有効な署名ではないため、メソッドpaintをオーバーライドするのではなく、新しいpaintメソッドを作成します。

  2. paintの代わりにpaintComponent(Graphics g)メソッドをオーバーライドする必要があります。

  3. JComponentを拡張しているため、オーバーライドされたpaintComponentメソッド内で最初にsuper.paintComponent(g)を呼び出す必要があります。

    public class JPanelExtended{ public void paintComponent(Graphics g){ super.paintComponent(g); ... } }

ComponentUIを拡張するクラスに関係することについては、スーパークラスでメソッドpaintを明示的に呼び出す必要があります。

public void paint(Graphics g, JComponent c) {
    super.paint(g,c);
}

編集:ちょっとした提案:メソッドをオーバーライドしたい場合は、署名の前に@override表記を付けると非常に便利です。

@Override
public void superMethodToBeOverridden(){}

このようにして、新しいメソッドを定義していて、既存のメソッドをオーバーライドしていない場合は、コンパイラからエラーメッセージが通知されます。

于 2011-09-13T14:14:52.447 に答える
5

描画メソッドで setBound() を呼び出さないでください。これは、ペイント コードではなく、レイアウト マネージャーの仕事です。

主な問題 (Heisenbug の指摘以外) は、コンポーネントにサイズを指定していないことだと思います。これは、getPreferredSize() をオーバーライドして、コンポーネントに適したサイズを返すことによって行われます。

詳細と実際の例については、カスタム ペインティングに関する Swing チュートリアルのセクションを参照してください。

于 2011-09-13T14:31:41.373 に答える