Фоновое изображение JFrame с контентом - PullRequest
3 голосов
/ 22 марта 2012

У меня есть JFrame с BorderLayout, есть панели со всех сторон (север, восток, ...).В основном на панелях есть надписи и кнопки.

Теперь я хочу, чтобы на кадре было фоновое изображение, некоторые исследования показали, что мне нужно было изменить панель содержимого моего кадра.Я пытаюсь это сделать, однако, контент помещается в фоновом режиме и не виден.Кроме того, я не знаю, как изменить размер изображения при изменении размера фрейма.

Есть ли простое решение для этого или мне придется переделывать большую часть моего кода?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012
  1. положить JPanel (или JComponent) с фоновым изображением в BorderLayout.CENTER, затем этот JPanel заполняет всю JFrame область, остальную часть JComponents поместите в эту JPanel

  2. there are Jpanels on all sides (North, East ,...). In the Jpanels there are Jlabels and Jbuttons mostly.

    эти JComponents покрывают все доступные Rectangle для JFrame, тогда Background Image (из моей 1-й точки) никогда не будут отображаться, потому что эти JComponents находятся на_top JFrame и могут быть скрыты этим Image а также

  3. добавить JPanel with Background Image (из моего 1-го пункта), затем поместить туда еще JPanel(s) с JPanel#setOpaque(false);, тогда этот JPanel будет прозрачным, уведомление JPanel реализовано по умолчанию FlowLayout

1 голос
/ 22 марта 2012
frame.getContentPane().add(new JPanel() {

      public void paintComponent(Graphics g) {
            g.drawImage(img, 0, 0, this.getWidth(), this.getHeight());
      }
});
0 голосов
/ 22 марта 2012

Этот пример поможет вам начать.Используйте его как любой JPanel.

public class JPanelWithBackground extends JPanel {
Image imageOrg = null;
Image image = null;
{
    addComponentListener(new ComponentAdapter() {
        public void componentResized(ComponentEvent e) {
            int w = JPanelWithBackground.this.getWidth();
            int h = JPanelWithBackground.this.getHeight();
            image = w>0&&h>0?imageOrg.getScaledInstance(w,h, 
                    java.awt.Image.SCALE_SMOOTH):imageOrg;
            JPanelWithBackground.this.repaint();
        }
    });
}
public JPanelWithBackground(Image i) {
    imageOrg=i;
    image=i;
    setOpaque(false);
}
public void paint(Graphics g) {
    if (image!=null) g.drawImage(image, 0, 0, null);
    super.paint(g);
}
}

Пример использования:

    Image image = your image
    JFrame f = new JFrame("");
    JPanel j = new JPanelWithBackground(image);
    j.setLayout(new FlowLayout());
    j.add(new JButton("YoYo"));
    j.add(new JButton("MaMa"));
    f.add(j);
    f.setVisible(true);
...