Оберните Swing JComponent в фоновое изображение

Один из методов для отображения фонового изображения на JPanel, чтобы переопределить paintComponent () метод. Это работает, но требует подклассов. Существует состава на основе альтернативы. Это делает использование прозрачных JComponent перед JLabel что краски фона изображения (иконы). Перекрытие JComponent и JLabel достигается с помощью GridBagLayout.

В следующем коде есть два завода методы упаковки Swing компонент в качестве фонового изображения (javax.swing.Icon):


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

        foregroundPanel.setBorder(

                BorderFactory.createEmptyBorder(10,10,10,10));

        foregroundPanel.setOpaque(false);

        

        foregroundPanel.add(new JLabel("Comment:"), BorderLayout.NORTH);

        foregroundPanel.add(new JScrollPane(new JTextArea(5,30)),

                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("bg.jpg"))));

        

        frame.pack();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);

    }

}

Данный код используется следующее изображение в качестве фона:



javax.swing

Примечание: Убедитесь, что место этого образа в той же папке, выше классом Java.

Запуск выше код содержит в себе следующие интерфейсы:



javax.swing

Другим преимуществом этого метода является то, что он использует только имущество настройки. Поэтому это может быть использовано в строители GUI как Матисса из Netbeans. Вот скриншот панели с фоновой картинки в builer Матисса GUI:



javax.swing


Источник: блог chitale's

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>