Как установить изображение в качестве фона для фрейма в Swing GUI java?

Я создал один графический интерфейс с использованием Swing Java. Я должен теперь установить одно изображение sample.jpeg в качестве фона для фрейма, на который я поместил мои компоненты. Как это сделать?

Ответ 1

В JPanel нет понятия "фонового изображения", поэтому нужно было бы написать свой собственный способ реализовать такие функция.

Одним из способов достижения этого было бы переопределить метод paintComponent для рисования фонового изображения при каждом обновлении JPanel.

Например, подкласс a 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.

Ответ 2

Это легко сделать, заменив панель содержимого фрейма на 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) на некоторых других компонентах, чтобы вы могли видеть их на фоне.)

Ответ 3

В Background Panel отображается несколько разных способов в зависимости от ваших требований.

Ответ 5

Вот еще один быстрый подход без использования дополнительной панели.

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);
  }
};

Ответ 6

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();
 }
 }

Ответ 7

Если вы используете netbeans, вы можете добавить jlabel к фрейму и через свойства изменить свой значок на свое изображение и удалить текст. затем переместите jlabel в нижнюю часть Jframe или любую область содержимого через навигатор