2012-03-23 3 views
0

背景を描画するカスタム図面を実装するJPanelがあります。この上に、アプリケーションはJButtonを配置して、JPanelの特定の領域のクリックを検出することができます。しかし、マウスで(不透明でない)ボタンをハイライト表示すると、基になるJPanelのグラフィックスはすべて不具合になります。JButtonを使用したJPanelのカスタム図面によるグラフィックグリッチ

My game

これらは、カスタム描画と9つのJPanel、2つの充填JButtonが(RとL)と、それらのそれぞれ。右上のブロックとそれのように見えるものは「新鮮」です。

rotatePanel = new JPanel(); 
     rotatePanel.setOpaque(false); 
     GridLayout rotateLayout = new GridLayout(1, 2); 
     rotatePanel.setLayout(rotateLayout); 

     rotateRight = new JButton("R"); 
     rotateRight.addActionListener(this); 
     rotateRight.setOpaque(false); 
     rotateRight.setContentAreaFilled(false); 
     rotateRight.setBorderPainted(false); 
     rotatePanel.add(rotateRight); 

     rotateLeft = new JButton("L"); 
     rotateLeft.addActionListener(this); 
     rotateLeft.setOpaque(false); 
     rotateLeft.setContentAreaFilled(false); 
     rotateLeft.setBorderPainted(false); 
     rotatePanel.add(rotateLeft); 

と、これは私の描画コードです:

  public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Rectangle clipRect = g.getClipBounds(); 
    clipRect.grow(-4, -4); 

    int thirdWidth = clipRect.width/3; 
    int thirdHeight = clipRect.height/3; 
    for (int x = 0; x < Board.DIM; x++) { 
     //Draw the columns 
     for (int y = 0; y < Board.DIM; y++) { 
      //Draw the rows 
      g.drawRect(thirdWidth * x, thirdHeight * y, thirdWidth, thirdHeight); 
     } 
    } 

    g.setColor(Color.BLACK); 
    g.drawRect(0, 0, clipRect.width, clipRect.height); 
} 

答えて

2
右下には、私はこのような私のボタンを作成するなど

、中央の1のみ「R」、両方のボタンがハイライトされています

子コンポーネントを変更すると、パネルの一部を再描画する必要がある場合、そのコンポーネントで重なっている領域だけを描画する必要があります。 g.getClipBounds()を実行すると、パネル全体の境界ではなく、塗りつぶす領域が得られます。おそらく、getWidth()getHeight()を使用したいだけです。

+0

ああ、もちろん。今私もJavaの絵について新しいことを学びました;)ありがとう! –

+0

+1 g.getClipBounds()が何をしているか分からなかった。 – david

0

私がなぜわからないが、パネルの再描画を強制的にボタンにActionListenerを追加することが役立つようだ:

rotateLeft.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     rotatePanel.repaint(); // rotatePanel must be final to be used here 
    } 

}); 

限り、私はラインが表示されていないが、ボタンを押し続けてactionListenerが起動され、その後に線が再描画されます。

rotateLeftボタンにMouseListenerを使用して、イベントmousePressed、mouseReleased、およびmouseClickedのコンポーネントを強制的に再描画することもできます。マウスボタンを押したまま線を表示する必要があります。

+0

これは機能しますが、ハックのような方法です。私のコードの問題は、彼が間違った領域で再ペイントすることです、あなたの修正は最初の場所で間違ったものを描画するのではなく、後で正しい領域に再描画することです:) –

関連する問題