3

ウィンドウを手動でドラッグすると JComponent が更新されるのに、repaint または revalidate を呼び出しても更新されない理由を理解しようとしています。データを表示する準備ができましたが、手動でサイズを変更するまで表示されません。再描画と再検証を試みたので、誰かが私にできることについていくつかの提案をすることができますか、それとも Swing の問題ではないように聞こえますか?

私が気付いた奇妙なことの1つは、次のコードがある場合です。

sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);

最初の行が使用されている場合、JComponent はそれ自体を更新します。これらの行をまったく使用しないか、両方とも使用しないと、奇妙に思えます。

私は基本的に、JDesktopPane の JInternalFrame に JPanel を入れています。私がやろうとしていることには2つの主な機能があります。1 つは新しい JPanel を追加し、もう 1 つはそれを更新しようとするため、新しいデータが表示されます。

public void addNewSP()
 {
sp = new JInternalFrame("SP");
  sp.setClosable(true);
  sp.setLocation(700, 400); //this should be changed to something based on screen size
  sp.setResizable(true);
  sp.add(popUp);
  this.parentContainer.add(sp, JLayeredPane.DRAG_LAYER);
  sp.pack();
  sp.show();
  sp.setSize(500, 500);
  sp.setPreferredSize(new Dimension(500, 500));
}

public void refreshSP()
 {

  sp.repaint();
  sp.validate();
  sp.repaint();

  sp.validate();
  parentContainer.validate();
  parentContainer.repaint();

  sp.setSize(sp.getSize().width, sp.getSize().height+1);
  sp.setSize(sp.getSize().width, sp.getSize().height-1);
  }
 }

ところで、parentContainer は JDesktopPane です

4

4 に答える 4

7

コンテナーのコンテンツを変更するときは、両方を呼び出す必要があります。

  • revalidate()コンテンツのレイアウトを再計算させる
  • repaint()このコンテナの再描画をリクエストするには
于 2010-08-30T20:57:51.977 に答える
1

手動でサイズを変更するまで表示されません。

あなたの質問の文脈がわかりません。そのため、以前に提案したように SSCCE を常に投稿する必要があります。

一般に、JComponent には適切なサイズがないため、Swing はコンポーネントをペイントする必要はないと考えていると思います。フレームのサイズを変更すると、コンポーネントが BorderLayout の中央に追加された可能性があるため、フレームのスペース全体を埋めるように自動的にサイズ変更されます。

解決策は、コンポーネントに「優先サイズ」を指定して、レイアウト マネージャーがこの情報を使用してコンポーネントを適切に表示できるようにすることです。

于 2010-08-31T03:29:29.127 に答える
0

コンテナのサブコンポーネントを変更する場合は、jcomponent.validate(); を呼び出す必要があります。

于 2010-08-30T19:24:07.567 に答える
0

parentContainerはJDesktopPaneだと思いますか?
どのような変更を行っているのに反映されspていませんか?

のサイズを変更するspと、Swing が最初から再描画されます。そのためsetSize() 、表示を修正しています。

ほとんどの場合、行っている変更は EDT で行われていないか、正しいコンテナーを無効にしていません。たとえば、 でコンポーネントの可視性を変更した場合、を呼び出してレイアウト マネージャーを再実行するsp必要があります。sp.invalidate()

EDT でコンポーネント (またはそのモデル) のみを変更していることを確認しましたか?

そのための簡単なテストは、Substance LAFで実行することです。別のスレッドで何かを変更すると、問題が発生します。

于 2010-08-31T16:18:27.640 に答える