357

その場で生成したJPEGおよびPNG画像を追加したいJPanelがあります

Swingチュートリアルでこれまでに見たすべての例、特にSwingの例ではsを使用していますImageIcon

私はこれらの画像をバイト配列として生成しています。通常、これらの画像は、例で使用されている一般的なアイコンよりも大きく、640x480です。

  1. ImageIconクラスを使用してJPanelでそのサイズの画像を表示することに(パフォーマンスまたはその他の)問題はありますか?
  2. それを行う通常の方法は何ですか?
  3. ImageIconクラスを使用せずにJPanelに画像を追加するにはどうすればよいですか?

編集:チュートリアルとAPIをさらに注意深く調べると、ImageIconをJPanelに直接追加できないことがわかります。代わりに、画像をJLabelのアイコンとして設定することで同じ効果を実現します。これはちょうど気分が悪いです...

4

14 に答える 14

539

JPanelsを使用している場合は、おそらくSwingを使用しています。これを試して:

BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);

これで、画像はスイングコンポーネントになりました。他のコンポーネントと同様に、レイアウト条件の影響を受けます。

于 2010-04-25T00:46:40.017 に答える
259

これが私がそれを行う方法です(画像をロードする方法についてもう少し情報があります):

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
       try {                
          image = ImageIO.read(new File("image name and path"));
       } catch (IOException ex) {
            // handle exception...
       }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters            
    }

}
于 2008-11-18T17:50:48.210 に答える
41

Fred Haslam のやり方はうまくいきます。ただし、jar 内の画像を参照したいので、ファイルパスに問題がありました。これを行うには、次を使用しました。

BufferedImage wPic = ImageIO.read(this.getClass().getResource("snow.png"));
JLabel wIcon = new JLabel(new ImageIcon(wPic));

この方法を使用してロードする必要がある画像は有限数 (約 10) しかないため、非常にうまく機能します。正しい相対ファイルパスを持たなくてもファイルを取得します。

于 2010-12-27T06:49:54.080 に答える
33

何かをサブクラス化する必要はないと思います。Jlabelを使用するだけです。画像を Jlabel に設定できます。したがって、Jlabel のサイズを変更してから、画像で埋めます。大丈夫です。これが私のやり方です。

于 2009-10-03T19:07:59.950 に答える
19

無料のSwingXライブラリの JXImagePanel クラスを使用すると、独自の Component サブクラスを完全にローリングすることを回避できます。

ダウンロード

于 2008-11-19T00:37:00.603 に答える
11
JLabel imgLabel = new JLabel(new ImageIcon("path_to_image.png"));
于 2013-05-04T21:40:06.673 に答える
7

JPanelをサブクラス化できます-これは私のImagePanelからの抜粋です。これは、画像を上/左、上/右、中央/中央、下/左、または下/右の5つの場所のいずれかに配置します。

protected void paintComponent(Graphics gc) {
    super.paintComponent(gc);

    Dimension                           cs=getSize();                           // component size

    gc=gc.create();
    gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
    if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2)       +mmHrzShift),(((cs.height-mmSize.height)/2)        +mmVrtShift),null); }
    if(tlImage!=null) { gc.drawImage(tlImage,(insets.left                       +tlHrzShift),(insets.top                           +tlVrtShift),null); }
    if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top                           +trVrtShift),null); }
    if(blImage!=null) { gc.drawImage(blImage,(insets.left                       +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
    if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
    }
于 2008-11-18T17:48:00.947 に答える
7
  1. 問題はないはずです(非常に大きな画像で発生する可能性のある一般的な問題を除く)。
  2. 1つのパネルに複数の画像を追加する場合は、ImageIconsを使用します。単一の画像の場合、画像を描画するためのカスタムサブクラスを作成し、そのメソッドをJPanelオーバーライドすることを検討します。paintComponent
  3. (2を参照)
于 2008-11-18T17:49:03.563 に答える
6

JPanelほとんどの場合、サブクラス化するのは間違ったクラスです。サブクラス化しないのはなぜJComponentですか?

ImageIconコンストラクターがイメージの読み取りをブロックするという点で、わずかな問題があります。アプリケーション jar からロードする場合は実際には問題になりませんが、ネットワーク接続を介して読み取る可能性がある場合は問題になる可能性があります。JDK のデモでも、AWT 時代の やその仲間MediaTrackerを使用した例がたくさんあります。ImageObserver

于 2008-11-18T18:21:05.323 に答える
6

私が取り組んでいるプライベートプロジェクトで非常に似たようなことをしています。これまでのところ、最大 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() をオーバーライドして) すべてのサイズを画像のフル サイズに合わせてください。

于 2008-11-18T18:28:11.940 に答える
5

プロジェクト ディレクトリにソース フォルダーを作成します。この場合は、Images という名前を付けました。

JFrame snakeFrame = new JFrame();
snakeFrame.setBounds(100, 200, 800, 800);
snakeFrame.setVisible(true);
snakeFrame.add(new JLabel(new ImageIcon("Images/Snake.png")));
snakeFrame.pack();
于 2016-04-18T05:02:53.293 に答える