ホームページ >Java >&#&チュートリアル >repaint()を使用しているにもかかわらず、拡張JPanelのpaintComponent()メソッドが呼び出されないのはなぜですか?

repaint()を使用しているにもかかわらず、拡張JPanelのpaintComponent()メソッドが呼び出されないのはなぜですか?

DDD
DDDオリジナル
2024-12-14 21:38:14884ブラウズ

Why Isn't My Extended JPanel's paintComponent() Method Being Called Despite Using repaint()?

拡張 JPanel クラスのメソッドPaintComponent() にアクセスしないプログラム

問題

提供されたコードには、JFrame とそれに対応する JPanel 拡張機能が含まれています。 JPanel の repaint() メソッドが繰り返し呼び出されている間、paintComponent() メソッドの実行に失敗します。このため、imageDimension オブジェクトが問題の原因である可能性があるという疑いが生じています。

解決策

提供されたコンテキストはバイト配列を明示的に参照していませんが、目的は、グレースケールのサムネイルを作成し、コンポーネントのアイコンに割り当てることであるようです。以下のサンプル コードは、既存のサンプル アイコンをグレースケールに変換し、setIcon() を使用してコンポーネントを更新するメソッドを提供します。このアプローチは、どの画像にも適用できます。

前述のグレースケール変換は、ColorConvertOp を使用するか、アイコンではなくコンポーネント自体を更新することによって実現できることに注目してください。

import java.awt.*;<br>import javax.swing.*;</p>
<p>public class IconExample {</p>
<pre class="brush:php;toolbar:false">public static void main(String[] args) {
    // Create a list of icons
    List<Icon> icons = new ArrayList<>();
    icons.add(new ImageIcon("image1.png"));
    icons.add(new ImageIcon("image2.png"));

    // Create a panel to hold the icons
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1, icons.size()));

    // Add the icons to the panel
    for (Icon icon : icons) {
        panel.add(new JLabel(icon));
    }

    // Create a frame for the panel
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.add(panel);

    // Make the frame visible
    frame.setVisible(true);

    // Create a timer to update the icons
    Timer timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // Shuffle the icons
            Collections.shuffle(icons);

            // Update the icons in the panel
            for (int i = 0; i < icons.size(); i++) {
                panel.getComponent(i).setIcon(icons.get(i));
            }

            // Repaint the panel
            panel.repaint();
        }
    });

    // Start the timer
    timer.start();
}

}

この例は、Collections.shuffle アイコンの順序をランダム化し、パネル内のアイコンを毎秒更新します。 repaint() メソッドにより、変更が画面上に確実に表示され、アイコンが継続的に更新されます。

この代替アプローチを提供することで、問題が

に関連していることを示します。 PaintComponent() メソッドは、imageDimension オブジェクトとは無関係である可能性があり、代わりに、グラフィックスと画像処理の特定の実装に由来します。元のコード。

以上がrepaint()を使用しているにもかかわらず、拡張JPanelのpaintComponent()メソッドが呼び出されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。