したがって、この質問には 2 つの部分があり、関連していると思われますが、ほとんどが抽象的です。簡単に言えば、ここで私がやっていることは次のとおりです。
私はそれにJFrame
とJPanel
とchild
JPanels
それぞれに 3JButtons
を持っています。また、JPanels とボタンをペイントできるようにする (ie ) のJComponent
呼び出しも作成しました。glassPanel
JFrame
myJFrame.setGlassPane(glassPanel)
(1) 基本的に の 3 つのボタンすべてをクリックすることによってトリガーされJPanel
、glassPanel
が に設定されVisible
ます (これは を呼び出すように見えますpaintComponent()
)。これは最初の質問に関連しています。
(2) では、ダブル バッファpaintComponent()
を使用して、長方形と画像を に描画してペイントします。これは2番目の質問に関連しています。glassPanel
関連する GlassPanel クラス コードは次のとおりです (これは今のところ抽象的な質問であるため、SSCCE ではありません)。
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
public class GlassPanel extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
setDoubleBuffered(true);
Graphics2D g2 = (Graphics2D) g;
g2.drawRect(x,y,width,height);
g2.fillRect(x,y,width,height);
g2.drawImage(img, x, y, this);
}
}
System.out.print
paintComponent() メソッド内にステートメントを配置することで、それが継続的に呼び出され、非同期にも呼び出されていることがわかりました。呼び出しがどのように行われると思うかについては、(1) を参照してください。また、コードのどこにも呼び出しがないことを絶対に確信しているとしましょうrepaint()
(何度も何度もチェックしました)。これが最初の質問の基本です。
初めて3つのボタンをクリックすると、すべてスムーズに進みます。四角形と画像は両方ともすぐに描画されます。ただし、次の 3 つのボタンをクリックすると (この時点でglassPanel
はsetVisible(true)
、最初の四角形と画像はまだ画面上にあり、最初の 3 つのボタンの上にペイントされています)、2 番目の四角形と画像は部分的にしか読み込まれません。JFrame
プログラムを実行したEclipseウィンドウから離れてクリックすると、呼び出しの数がpaintComponent()
毎回同じ量だけ急速に増加し、部分的にロードされた画像と長方形がすぐに完全に表示されますバックグラウンドでJFrame
。クリックして JFrame に戻ると、呼び出しの数が再び正確に増加します)。これが 2 番目の質問の基本です。
更新:ここに私が読んだものがあります:
また、GUI が別のウィンドウで覆われ、その後覆われなくなった場合、ペイント システムは、新たに覆われた領域と等しいペイント領域で paintComponent メソッドを呼び出します。
私の質問は次のとおりです。
(1) がpaintComponent()
なしで呼び出されるのはなぜrepaint()
ですか? または、同様の質問で、paintComponent() を呼び出しているのは何ですか?
更新: 少し計算した後、すべてのコンポーネント (すべてのボタンとパネル) によって継続的に呼び出されていると強く信じています。それでも、repaint() の呼び出しはありません...
(2) JFrame ウィンドウからフォーカスを移すまで、画像が部分的に読み込まれるのはなぜですか?
私は多くのことを試したことに注意してください:(a)独自のdoubleBufferを作成し、ダブルバッファを使用しない(主にアニメーション用であることはわかっています)、(b)オーバーライドしてオーバーライドしないpaintComponent()
、(c)画像を描画して描画しない(長方形はまだ読み込みに時間がかかる)、(d) がないことを完全に確認するrepaint()
、(e) を使用する場合と使用しない場合SwingUtilities.invokeLater(new Runnable() {
public void run() { //stuff});
、(f) if
setVisible(true) を 1 回だけ実行するステートメントを実行する。
必要に応じて SSCCE を試してみることもできますが、これらはより抽象的なものだと思います。ありがとう!