私が取り組んでいるプライベートプロジェクトで非常に似たようなことをしています。これまでのところ、最大 1024x1024 の画像を問題なく (メモリを除いて) 生成しており、パフォーマンスの問題もなく非常に高速に表示できます。
JPanel サブクラスの paint メソッドをオーバーライドするのはやり過ぎであり、必要以上の作業が必要になります。
私がそれを行う方法は次のとおりです。
Class MapIcon implements Icon {...}
また
Class MapIcon extends ImageIcon {...}
画像を生成するために使用するコードは、このクラスにあります。BufferedImage を使用して描画し、paintIcon() が呼び出されたときに g.drawImvge(bufferedImage); を使用します。これにより、画像の生成中に行われるフラッシュの量が減り、スレッド化できます。
次に、JLabel を拡張します。
Class MapLabel extends Scrollable, MouseMotionListener {...}
これは、画像をスクロール ペインに配置したい、つまり、画像の一部を表示し、必要に応じてユーザーがスクロールできるようにするためです。
そこで、JScrollPane を使用して、MapIcon のみを含む MapLabel を保持します。
MapIcon map = new MapIcon ();
MapLabel mapLabel = new MapLabel (map);
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport ().add (mapLabel);
ただし、シナリオでは(毎回画像全体を表示するだけです)。MapLabel を一番上の JPanel に追加する必要があり、(GetPreferredSize() をオーバーライドして) すべてのサイズを画像のフル サイズに合わせてください。