0

私の paintComponent() メソッド内に、jpanel の背景を描画する drawRect() があります。ただし、jbutton は paintComponent() メソッドが呼び出される前に画面に描画されるため、jbutton は drawRect によってブロックされます。これを修正する方法を知っている人はいますか?私の推測では、再描画が呼び出される前に jbutton を追加することですが、その方法がわかりません。

いくつかのコード:

public Frame(){
  add(new JButton());
}

public void paintComponent(Graphics g){
  super.paintComponent(g);
  g.drawRect(0,0,screenwidth,screenheight); //paints the background with a color 
                                            //but blocks out the jbutton.
}
4

3 に答える 3

6

さて、まず、ここで何が間違っているかを説明します -JFrameは ではなく、オーバーライドする必要JComponentはありません。paintComponentあなたのコードはおそらく決して呼び出されません。それとは別にdrawRect、長方形を描くだけで、塗りつぶしはしません。


ただし、これを行う適切な方法があると思います。

を使用しているため、 を介しJFrameてコンテナのレイヤード ペインJFrame.getLayeredPaneを利用する必要があります。

レイヤード ペインは、重なっているコンポーネントを重ねて表示できる深さのあるコンテナーです。レイヤード ペインに関する一般的な情報は、 レイヤード ペインの使用方法 にあります。このセクションでは、ルート ペインが階層化されたペインを使用する方法の詳細について説明します。

ルート ペインについては、Java チュートリアルの一部であるHow to Use Root Panesで説明されています。階層化されたペインはルート ペインの子でありJFrame、最上位のコンテナとして、下にある を利用しJRootPaneます。

とにかく、背景の作成に興味があるので、階層化されたペインがトップレベルのコンテナー内で一般的にどのように見えるかについては、次の図を参照してください。

以下の表は、各レイヤーの使用目的を説明し、各レイヤーに対応する JLayeredPane 定数を示しています。

画層名--説明

FRAME_CONTENT_LAYER - new Integer(-30000)- ルート ペインは、メニュー バーとコンテンツ ペインをこの深さのレイヤード ペインに追加します。

背景がコンテンツの背後にあることを指定したいので、次のように、最初に同じレイヤー ( JLayeredPane.FRAME_CONTENT_LAYER) に追加します。

final JComponent background = new JComponent() {

  private final Dimension size = new Dimension(screenwidth, screenheight);

  private Dimension determineSize() {
    Insets insets = super.getInsets();
    return size = new Dimension(screenwidth + insets.left + insets.right,
        screenheight + insets.bottom + insets.top);
  }

  public Dimension getPreferredSize() {
    return size == null ? determineSize() : size;
  }

  public Dimension getMinimumSize() {
    return size == null ? determineSize() : size;
  }

  protected void paintComponent(final Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, screenwidth, screenheight);
  }
};
final JLayeredPane layeredPane = frame.getLayeredPane();
layeredPane.add(background, JLayeredPane.FRAME_CONTENT_LAYER);

ここで、コンテンツの前に背景を確実に描画するために、以下を使用しますJLayeredPane.moveToBack

layeredPane.moveToBack(background);
于 2012-08-24T23:46:23.860 に答える
5

私はこの本当に簡単なテストを行いました。HovercraftFullOfEels が指摘したように。JFrame には がないpaintComponentため、代わりに を使用しJPanelました。

私がみえますか

このコードによって生成されたもの

public class PanelTest extends JPanel {

    private JButton button;

    public PanelTest() {

        setLayout(new GridBagLayout());

        button = new JButton("Can you see me ?");
        add(button);

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Rectangle bounds = button.getBounds();
        bounds.x -= 10;
        bounds.y -= 10;
        bounds.width += 20;
        bounds.height += 20;

        g.setColor(Color.RED);
        ((Graphics2D)g).fill(bounds);

    }

}

paintComponentsで使用して問題を再現しようとしましたJFrameが、長方形が表示されません。に上書きpaintしてもJFrame、長方形はボタンの下にペイントされたままです (どちらもお勧めしません)。

問題は、何が問題なのかを知るのに十分なコードを提供していないことです

ps -drawRect何も「埋めません」

于 2012-08-24T23:38:07.953 に答える
1

私は以前にこれに遭遇しましたが、特にjframeではなく、あなたが持っているようなシナリオでもありません。このコードを試してください、

    this.getContentPane.repaint();

あなたのjframeに。これについてはよくわかりませんが、試してみてください。

于 2012-08-25T08:29:31.430 に答える