web-dev-qa-db-ja.com

javaのSwing GUIでフレームの背景として画像を設定する方法は?

Swing of Javaを使用して1つのGUIを作成しました。ここで、1つのsample.jpegイメージを、コンポーネントを配置したフレームの背景として設定する必要があります。

12
om.

JPanel には「背景画像」の概念がないため、このような機能を実装する独自の方法を記述する必要があります。

これを達成する1つの方法は、 paintComponent メソッドをオーバーライドして、JPanelが更新されるたびに背景画像を描画することです。

たとえば、JPanelをサブクラス化し、背景画像を保持するフィールドを追加して、paintComponentメソッドをオーバーライドします。

_public class JPanelWithBackground extends JPanel {

  private Image backgroundImage;

  // Some code to initialize the background image.
  // Here, we use the constructor to load the image. This
  // can vary depending on the use case of the panel.
  public JPanelWithBackground(String fileName) throws IOException {
    backgroundImage = ImageIO.read(new File(fileName));
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    // Draw the background image.
    g.drawImage(backgroundImage, 0, 0, this);
  }
}
_

(上記のコードはテストされていません。)

次のコードを使用して、JPanelWithBackgroundJFrameに追加できます。

_JFrame f = new JFrame();
f.getContentPane().add(new JPanelWithBackground("sample.jpeg"));
_

この例では、 ImageIO.read(File) メソッドを使用して外部JPEGファイルを読み取りました。

21
coobird

これは、フレームのコンテンツペインを画像を描画するJPanelに置き換えることで簡単に行えます。

_try {
    final Image backgroundImage = javax.imageio.ImageIO.read(new File(...));
    setContentPane(new JPanel(new BorderLayout()) {
        @Override public void paintComponent(Graphics g) {
            g.drawImage(backgroundImage, 0, 0, null);
        }
    });
} catch (IOException e) {
    throw new RuntimeException(e);
}
_

この例では、パネルのレイアウトをBorderLayoutに設定して、デフォルトのコンテンツペインレイアウトに一致させます。

(画像の表示に問題がある場合は、他のコンポーネントでsetOpaque(false)を呼び出して、背景が透けて見えるようにする必要があります。)

5
Boann

背景パネル エントリは、要件に応じていくつかの異なる方法を示しています。

3
camickr

コンポーネントのサブクラスを作成できます

http://www.jguru.com/faq/view.jsp?EID=9691

または、ラッパーをいじる

http://www.Java-tips.org/Java-se-tips/javax.swing/wrap-a-swing-jcomponent-in-a-background-image.html

2
UberAlex

おそらく最も簡単な方法は、画像を追加し、それをスケーリングし、JFrame/JPanel(私の場合はJPanel)に設定することですが、他の子コンポーネントを追加した後にのみコンテナに「追加」することを忘れないでください。 enter image description here

    ImageIcon background=new ImageIcon("D:\\FeedbackSystem\\src\\images\\background.jpg");
    Image img=background.getImage();
    Image temp=img.getScaledInstance(500,600,Image.SCALE_SMOOTH);
    background=new ImageIcon(temp);
    JLabel back=new JLabel(background);
    back.setLayout(null);
    back.setBounds(0,0,500,600);
1
Ankit Sharma

netbeansを使用している場合は、フレームにjlabelを追加し、プロパティを使用してアイコンを画像に変更し、テキストを削除できます。次に、jlabelをJframeの下部またはナビゲーターを介して任意のコンテンツペインに移動します

1
ThilinaMD

追加のパネルを使用しない別の簡単な方法を次に示します。

JFrame f = new JFrame("stackoverflow") { 
  private Image backgroundImage = ImageIO.read(new File("background.jpg"));
  public void Paint( Graphics g ) { 
    super.Paint(g);
    g.drawImage(backgroundImage, 0, 0, null);
  }
};
1
xrath
import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;
class BackgroundImageJFrame extends JFrame
{
  JButton b1;
  JLabel l1;
public BackgroundImageJFrame()
{
setTitle("Background Color for JFrame");
setSize(400,400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
/*
 One way
-----------------*/
setLayout(new BorderLayout());
JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png"));
add(background);
background.setLayout(new FlowLayout());
l1=new JLabel("Here is a button");
b1=new JButton("I am a button");
background.add(l1);
background.add(b1);

// Another way
setLayout(new BorderLayout());
setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads  \\colorful design.png")));
setLayout(new FlowLayout());
l1=new JLabel("Here is a button");
b1=new JButton("I am a button");
add(l1);
add(b1);
// Just for refresh :) Not optional!
  setSize(399,399);
   setSize(400,400);
   }
   public static void main(String args[])
  {
   new BackgroundImageJFrame();
 }
 }
0
dhaval joshi