2011-11-15 4 views
1

を壊すことなく、私は私が隠すJPanelのレイアウト

  • メインパネル
    • 左パネル
    • 右側のパネル

ブースのような3枚のパネルを配置した画面を持っていますパネルは親パネルのサイズの半分になります。 レイアウトを破ることなく、左パネルを非表示にしたい。 (これは何とか私の要件 'BorderLayout'でハードコーディングされています)。右のパネルは、メインパネルのサイズの半分の大きさでなければなりません。

私の解決策: 私は塗装メソッドをオーバーライドし、ブール値「propHideContents」を追加しました。

@Override 
public void paintComponents(Graphics g) { 
    if (propHideContents && isVisible()) { 
     paintBlankPanel(g); 
     return; 
    } 
    super.paintComponents(g); 
} 

@Override 
protected void paintChildren(Graphics g) { 
    if (propHideContents && isVisible()) { 
     paintBlankPanel(g); 
     return; 
    } 
    super.paintChildren(g); 
} 

private void paintBlankPanel(Graphics g) { 

    Graphics scratchGraphics = (g == null) ? null : g.create(); 
    try { 
     scratchGraphics.setColor(this.getBackground()); 
     scratchGraphics.clipRect(0, 0, this.getWidth(), this.getHeight()); 
    } finally { 
     scratchGraphics.dispose(); 
    } 
} 

非表示ロジックは

public void setPropHideContents(boolean propHideContents) { 
    if (this.propHideContents != propHideContents) { 
     this.propHideContents = propHideContents; 
     setEnabled(!propHideContents); 
     if (getParent() != null) { 
      getParent().repaint(); 
     } 
    } 
} 

のように見えるほぼすべてが動作しているが、私は、次のテストケース

durignリフレッシュ問題を持っている私は、画面に2つのボタンを追加しました。 1つは可視状態を変更するためのもので、もう1つは隠れた状態のものです。

ブースパネルは表示されません。 'visibility'ボタンを押すと、ボタンは非表示パネルの領域に描画されます。マウスカーソルで画面を手動でサイズを変更すると、再描画イベントが隠しパネルをリフレッシュし、間違って描画されたオブジェクトが削除されます。

  1. どうすればこれらのケースを処理できますか?
  2. 誰かがより良い解決策を持っていますか?
+2

レイアウトに問題がある場合は、ペイントコードでレイアウト領域_not_で解決してください。ニーズに合ったLayoutManagerを使用できないのはなぜですか? – kleopatra

答えて

3

左パネルと右パネルの代わりに、CardLayoutを持つコンテナを配置します。各コンテナには、パネルとプレースホルダ(たとえば、もう1つのパネル)を左(または右)に配置する必要があります。左(または右)のパネルを非表示にする場合は、空のパネルを示すカードを交換してください。

+0

thansk多くの場合、CardLayoutは私にとって初めてのものです。これは私が探していた解決策です。 –

2

解決策は実行できません。修正することはできません。ペイントは親コンポーネントからのものではなく、必要に応じて子コンポーネントを独自にペイントすることができます(これはあなたが経験するものです)。

外部要件のために別のレイアウトマネージャを使用できない場合は、左パネルのコンテンツを非表示にするために削除する必要があります。他のパネルに子をラップするだけで、パネルを削除したときに簡単に保存できます。

+0

私は、レイアウトは何らかの形でハードコードされていると思っていましたが、私はusecaseの回避策を使うことができると考えました。 –

+0

新しいレイアウトについて知りたい場合は、Miglayoutを見てください。これは、最も柔軟なレイアウトマネージャー(IMO)です。 –

関連する問題