Фоновое изображение в Java - PullRequest
2 голосов
/ 25 апреля 2010

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

вот код , который я использовал:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class BackgroundImagePanelExample {

    // Set up contraints so that the user supplied component and the
    // background image label overlap and resize identically
    private static final GridBagConstraints gbc;

    static {
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
    }

    /**
     * Wraps a Swing JComponent in a background image. Simply invokes the overloded
     * variant with Top/Leading alignment for background image.
     *
     * @param component - to wrap in the a background image
     * @param backgroundIcon - the background image (Icon)
     * @return the wrapping JPanel
     */
    public static JPanel wrapInBackgroundImage(JComponent component,
        Icon backgroundIcon) {
        return wrapInBackgroundImage(
            component,
            backgroundIcon,
            JLabel.TOP,
            JLabel.LEADING);
    }

    /**
     * Wraps a Swing JComponent in a background image. The vertical and horizontal
     * alignment of background image can be specified using the alignment
     * contants from JLabel.
     *
     * @param component - to wrap in the a background image
     * @param backgroundIcon - the background image (Icon)
     * @param verticalAlignment - vertical alignment. See contants in JLabel.
     * @param horizontalAlignment - horizontal alignment. See contants in JLabel.
     * @return the wrapping JPanel
     */
    public static JPanel wrapInBackgroundImage(JComponent component,
        Icon backgroundIcon,
        int verticalAlignment,
        int horizontalAlignment) {

        // make the passed in swing component transparent
        component.setOpaque(false);

        // create wrapper JPanel
        JPanel backgroundPanel = new JPanel(new GridBagLayout());

        // add the passed in swing component first to ensure that it is in front
        backgroundPanel.add(component, gbc);

        // create a label to paint the background image
        JLabel backgroundImage = new JLabel(backgroundIcon);

        // set minimum and preferred sizes so that the size of the image
        // does not affect the layout size
        backgroundImage.setPreferredSize(new Dimension(1, 1));
        backgroundImage.setMinimumSize(new Dimension(1, 1));

        // align the image as specified.
        backgroundImage.setVerticalAlignment(verticalAlignment);
        backgroundImage.setHorizontalAlignment(horizontalAlignment);

        // add the background label
        backgroundPanel.add(backgroundImage, gbc);

        // return the wrapper
        return backgroundPanel;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Background Image Panel Example");

        // Create some GUI
        JPanel foregroundPanel = new JPanel(new BorderLayout(10, 10));
        foregroundPanel.setBorder(
            BorderFactory.createEmptyBorder(10, 10, 10, 10));
        foregroundPanel.setOpaque(false);

        foregroundPanel.add(new JLabel("Comment:"), BorderLayout.NORTH);
        foregroundPanel.add(new JScrollPane(new JTextArea(3, 10)),
            BorderLayout.CENTER);
        foregroundPanel.add(
            new JLabel(
            "Please enter your comments in text box above."
            + " HTML syntax is allowed."), BorderLayout.SOUTH);

        frame.setContentPane(wrapInBackgroundImage(foregroundPanel,
            new ImageIcon(
            BackgroundImagePanelExample.class.getResource("backgd.jpg"))));

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

спасибо

Ответы [ 4 ]

1 голос
/ 25 апреля 2010

Я предполагаю, что вы получаете java.lang.NullPointerException, потому что backgd.jpg не может быть найдено getResource(). Возможно, вы сможете поместить файл изображения вместе с исходным файлом и перестроить проект. Кроме того, вы можете загрузить его из файловой системы как временную меру, пока вы разбираетесь.

frame.setContentPane(wrapInBackgroundImage(
    foregroundPanel, new ImageIcon("image.jpg")));
1 голос
/ 25 апреля 2010
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageTest {

  public static void main(String[] args) {
    ImagePanel panel = new ImagePanel(new ImageIcon("images/background.png").getImage());

    JFrame frame = new JFrame();
    frame.getContentPane().add(panel);
    frame.pack();
    frame.setVisible(true);
  }
}

class ImagePanel extends JPanel {

  private Image img;

  public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
  }

  public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }

}
1 голос
/ 25 апреля 2010

Я на самом деле не понимаю, о чем ты спрашиваешь. Если вы спрашиваете, существует ли более простой способ создания Swing-приложений, чем ответ «ДА». Используйте среду IDE NetBeans со сборщиком Swing, который создает очень разумный сгенерированный код и позволяет редактировать целую кучу компонентов. Написанный от руки Swing чаще всего «сломан», чем сгенерированный код из NetBeans, и требует гораздо больше времени ...

0 голосов
/ 14 мая 2011
public class BackgroundPanel extends JPanel {

private static final long serialVersionUID = 1L;
Image image;

public BackgroundPanel() {
    super();
    initialize();
}

/**
 * This method initializes this
 * 
 * @return void
 */
private void initialize() {
    try {
        image = new ImageIcon(getClass().getResource("background.jpg")).getImage();
    } catch (Exception e) {
        /*handled in paintComponent()*/
    }
    this.setSize(800, 470);
    this.setLayout(null);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); 
    if(image != null) {
        g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...