23

新しいクラスやメソッドを作成せずに、JPanel の残りの属性と一緒に挿入するだけで、背景画像を JPanel に追加するにはどうすればよいですか?

画像を使用して JPanel の背景を設定しようとしていますが、私が見つけたすべての例は、独自のクラスでパネルを拡張することを示唆しているようです。

まったく新しいクラスを作成せずに、同じメソッド内で単純に画像を追加する方法を探していました (物事を整理してシンプルに保つようにしています)。

JPanel を設定するメソッドの例を次に示します。

public static JPanel drawGamePanel(){
    //Create game panel and attributes
    JPanel gamePanel = new JPanel();
    Image background = Toolkit.getDefaultToolkit().createImage("Background.png");
    gamePanel.drawImage(background, 0, 0, null);
    //Set Return
    return gamePanel;
}
4

7 に答える 7

28

画像を使用してJPanelの背景を設定しようとしていますが、見つけたすべての例は、独自のクラスでパネルを拡張することを示唆しているようです

はい、そのためには関数を拡張JPanelしてオーバーライドする必要があります。paintcomponent(Graphics g)

@Override
  protected void paintComponent(Graphics g) {

    super.paintComponent(g);
        g.drawImage(bgImage, 0, 0, null);
}

まったく新しいクラスを作成せずに、同じメソッド内で単純に画像を追加する方法を探していました (物事を整理してシンプルに保つようにしています)。

必要に応じて、画像をアイコンとして直接追加できる他のコンポーネントを使用できますJLabel

ImageIcon icon = new ImageIcon(imgURL); 
JLabel thumb = new JLabel();
thumb.setIcon(icon);

しかし、再び括弧内で物事を整理してシンプルに保つようにしています!! 新しいクラスを作成するだけで、厄介な世界につながると思うのはなぜですか?

于 2013-10-01T21:07:10.837 に答える
17

画像を JPanel の背景として設定する最も簡単な方法

JPanel を使用しないでください。JLabel と Icon を使用するだけで、カスタム コードは必要ありません。

詳細については、背景パネルと、3 つの異なる描画オプションを使用して JPanel に画像を描画するソリューションを参照してください。

  1. スケーリングされた
  2. タイル張り
  3. 実際
于 2013-10-01T23:59:21.303 に答える
5

私が知っている方法はpaintComponent、継承を要求するメソッドをオーバーライドすることですJPanel

 @Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); // paint the background image and scale it to fill the entire space
    g.drawImage(/*....*/);
}

2 番目のカスタムを作成して配置するもう 1 つの方法 (少し複雑)JPanelは、メインの背景として使用できます。

画像パネル

public class ImagePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Image image = null;
private int iWidth2;
private int iHeight2;

public ImagePanel(Image image)
{
    this.image = image;
    this.iWidth2 = image.getWidth(this)/2;
    this.iHeight2 = image.getHeight(this)/2;
}


public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (image != null)
    {
        int x = this.getParent().getWidth()/2 - iWidth2;
        int y = this.getParent().getHeight()/2 - iHeight2;
        g.drawImage(image,x,y,this);
    }
}
}

空のパネル

public class EmptyPanel extends JPanel{

private static final long serialVersionUID = 1L;

public EmptyPanel() {
    super();
    init();
}

@Override
public boolean isOptimizedDrawingEnabled() {
    return false;
}


public void init(){

    LayoutManager overlay = new OverlayLayout(this);
    this.setLayout(overlay);

    ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
    iPanel.setLayout(new BorderLayout());   
    this.add(iPanel);
    iPanel.setOpaque(false);                
}
}

IconToImage

public class IconToImage {

Icon icon;
Image image;


public IconToImage(Icon icon) {
    this.icon = icon;
    image = iconToImage();
}

public Image iconToImage() { 
    if (icon instanceof ImageIcon) { 
        return ((ImageIcon)icon).getImage(); 
    } else { 
        int w = icon.getIconWidth(); 
        int h = icon.getIconHeight(); 
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
        GraphicsDevice gd = ge.getDefaultScreenDevice(); 
        GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
        BufferedImage image = gc.createCompatibleImage(w, h); 
        Graphics2D g = image.createGraphics(); 
        icon.paintIcon(null, g, 0, 0); 
        g.dispose(); 
        return image; 
    } 
}


/**
 * @return the image
 */
public Image getImage() {
    return image;
}
}
于 2013-10-01T20:59:33.470 に答える
4

フレームに追加された JPanel の背景に画像を描画します。通常、レイアウト マネージャーを使用して、ボタンやその他のコンポーネントをパネルに追加します。他の子パネルを追加する場合は、おそらく child.setOpaque(false) を設定する必要があります。

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.net.URL;

public class BackgroundImageApp {
    private JFrame frame;

    private BackgroundImageApp create() {
        frame = createFrame();
        frame.getContentPane().add(createContent());

        return this;
    }

    private JFrame createFrame() {
        JFrame frame = new JFrame(getClass().getName());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        return frame;
    }

    private void show() {
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private Component createContent() {
        final Image image = requestImage();

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        };

        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        for (String label : new String[]{"One", "Dois", "Drei", "Quatro", "Peace"}) {
            JButton button = new JButton(label);
            button.setAlignmentX(Component.CENTER_ALIGNMENT);
            panel.add(Box.createRigidArea(new Dimension(15, 15)));
            panel.add(button);
        }

        panel.setPreferredSize(new Dimension(500, 500));

        return panel;
    }

    private Image requestImage() {
        Image image = null;

        try {
            image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return image;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BackgroundImageApp().create().show();
            }
        });
    }
}
于 2014-07-05T16:38:00.217 に答える