web-dev-qa-db-ja.com

JFrameに画像を追加する

そのため、WindowsビルダーでEclipseを使用しています。とにかく、JFrameに表示される画像をインポートして、場所とサイズを設定して描画するのではなく、簡単に移動してサイズを変更できるかどうか疑問に思っていました。

9
user2612619

Swingには特別な画像コンポーネントはありません(私の意見では悲しいことです)。そのため、いくつかのオプションがあります。

  1. @Reimeusが言ったように:アイコン付きのJLabelを使用します。
  2. ウィンドウビルダーで、画像の場所を表すJPanelを作成します。次に、変更する必要のない数行のコードを使用して、独自のカスタムイメージコンポーネントをJPanelに追加します。次のようになります。

    _JImageComponent ic = new JImageComponent(myImageGoesHere);
    imagePanel.add(ic);
    _

    jImageComponentは、paintComponent()メソッドをオーバーライドして画像を描画するJComponentを拡張する自己作成クラスです。

14

JFrameに画像を追加する簡単な例を次に示します。

frame.add(new JLabel(new ImageIcon("Path/To/Your/Image.png")));
21
Rollyng

Netbeansを使用して開発している場合は、jLabelを使用して、そのアイコンプロパティを変更します。

3
rishad2m8

Martijn-courteauxが言ったように、カスタムコンポーネントを作成する方が良いオプションです。 C#には PictureBox というコンポーネントが存在し、このコンポーネントをJava用に作成しようとしました。コードは次のとおりです。

import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Image;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;

public class JPictureBox extends JComponent {

    private Icon icon = null;
    private final Dimension dimension = new Dimension(100, 100);
    private Image image = null;
    private ImageIcon ii = null;
    private SizeMode sizeMode = SizeMode.STRETCH;
    private int newHeight, newWidth, originalHeight, originalWidth;

    public JPictureBox() {
        JPictureBox.this.setPreferredSize(dimension);
        JPictureBox.this.setOpaque(false);
        JPictureBox.this.setSizeMode(SizeMode.STRETCH);
    }

    @Override
    public void paintComponent(Graphics g) {
        if (ii != null) {
            switch (getSizeMode()) {
                case NORMAL:
                    g.drawImage(image, 0, 0, ii.getIconWidth(), ii.getIconHeight(), null);
                    break;
                case ZOOM:
                    aspectRatio();
                    g.drawImage(image, 0, 0, newWidth, newHeight, null);
                    break;
                case STRETCH:
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
                    break;
                case CENTER:
                    g.drawImage(image, (int) (this.getWidth() / 2) - (int) (ii.getIconWidth() / 2), (int) (this.getHeight() / 2) - (int) (ii.getIconHeight() / 2), ii.getIconWidth(), ii.getIconHeight(), null);
                    break;
                default:
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
            }
        }
    }

    public Icon getIcon() {
        return icon;
    }

    public void setIcon(Icon icon) {
        this.icon = icon;
        ii = (ImageIcon) icon;
        image = ii.getImage();
        originalHeight = ii.getIconHeight();
        originalWidth = ii.getIconWidth();
    }

    public SizeMode getSizeMode() {
        return sizeMode;
    }

    public void setSizeMode(SizeMode sizeMode) {
        this.sizeMode = sizeMode;
    }

    public enum SizeMode {
        NORMAL,
        STRETCH,
        CENTER,
        ZOOM
    }

    private void aspectRatio() {
        if (ii != null) {
            newHeight = this.getHeight();
            newWidth = (originalWidth * newHeight) / originalHeight;
        }
    }

}

画像を追加する場合は、JPictureBoxを選択し、その後[プロパティ]に移動して[アイコン]プロパティを見つけ、画像を選択します。 sizeModeプロパティを変更する場合は、JPictureBoxを選択します。その後、Propertiesに移動し、「sizeMode」プロパティを見つけて、いくつかの値を選択できます。

  • NORMAL値。画像はJPictureBoxの左上隅に配置されます。
  • STRETCH値により、画像はJPictureBoxに合わせて伸縮します。
  • ZOOM値を使用すると、画像がJPictureBoxに合わせて伸縮されます。ただし、オリジナルのアスペクト比は維持されます。
  • CENTER値により、画像はクライアント領域の中央に配置されます。

このトピックについて詳しく知りたい場合は、これを確認してください video

また、コードは Gitlab または Github で確認できます。

2
ricardo130