Swing of Javaを使用して1つのGUIを作成しました。ここで、1つのsample.jpegイメージを、コンポーネントを配置したフレームの背景として設定する必要があります。
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);
}
}
_
(上記のコードはテストされていません。)
次のコードを使用して、JPanelWithBackground
をJFrame
に追加できます。
_JFrame f = new JFrame();
f.getContentPane().add(new JPanelWithBackground("sample.jpeg"));
_
この例では、 ImageIO.read(File)
メソッドを使用して外部JPEGファイルを読み取りました。
これは、フレームのコンテンツペインを画像を描画する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)
を呼び出して、背景が透けて見えるようにする必要があります。)
背景パネル エントリは、要件に応じていくつかの異なる方法を示しています。
おそらく最も簡単な方法は、画像を追加し、それをスケーリングし、JFrame/JPanel(私の場合はJPanel)に設定することですが、他の子コンポーネントを追加した後にのみコンテナに「追加」することを忘れないでください。
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);
netbeansを使用している場合は、フレームにjlabelを追加し、プロパティを使用してアイコンを画像に変更し、テキストを削除できます。次に、jlabelをJframeの下部またはナビゲーターを介して任意のコンテンツペインに移動します
追加のパネルを使用しない別の簡単な方法を次に示します。
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);
}
};
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();
}
}