Добавление фонового изображения в JPanel при нажатии кнопки

Как лучше всего добавить фоновое изображение в JPanel/JLabel при вызове JButton? Я знаю, как получить действие JButton и тому подобное. Я просто не могу понять или найти способ изменить фоновое изображение при нажатии этой кнопки.


person Community    schedule 14.06.2012    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE. Это может ответить на вопросы, возникающие в результате таких вещей, как Я просто не могу понять или найти способ изменить фоновое изображение при нажатии этой кнопки. E.G. Как вы загружаете его в первую очередь?   -  person Andrew Thompson    schedule 14.06.2012


Ответы (2)


Вот пример:

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class ModifiableBackgroundFrame extends JFrame implements ActionListener
{
    private static final long serialVersionUID = 1L;
    private ImageIcon image;
    private JPanel pan;
    private JButton btn;
    private int count = 0;
    private static final String[] images = 
        {"http://www.dvd-ppt-slideshow.com/images/ppt-background/background-3.jpg",
        "http://www.psdgraphics.com/wp-content/uploads/2009/02/abstract-background.jpg",
        "http://hdwallpaperpics.com/wallpaper/picture/image/background.jpg",
        "http://www.highresolutionpics.info/wp-content/uploads/images/beautiful-on-green-backgrounds-for-powerpoint.jpg"};

    public ModifiableBackgroundFrame()
    {
        super("The title");

        image = new ImageIcon();

        btn = new JButton("Change background");
        btn.setFocusPainted(false);
        btn.addActionListener(this);
        pan = new JPanel()
        {
            private static final long serialVersionUID = 1L;

            @Override
            public void paintComponent(Graphics g)
            {
                g.drawImage(image.getImage(), 0, 0, null);
            }
        };
        pan.setPreferredSize(new Dimension(400, 400));

        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(pan, BorderLayout.CENTER);
        contentPane.add(btn, BorderLayout.SOUTH);

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ModifiableBackgroundFrame();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        btn.setEnabled(false);
        btn.setText("Loading...");
        new SwingWorker<Image, Void>()
        {
            @Override
            protected Image doInBackground() throws Exception
            {
                return ImageIO.read(new URL(images[count++ % 4]));
            }

            @Override
            protected void done()
            {
                try
                {
                    image.setImage(get());
                    pan.repaint();
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
                catch(ExecutionException e)
                {
                    e.printStackTrace();
                }
                btn.setText("Change background");
                btn.setEnabled(true);
            }
        }.execute();
    }
}
person Eng.Fouad    schedule 14.06.2012
comment
Хорошее использование SwingWorker. :) - person Andrew Thompson; 14.06.2012
comment
@Eng.Fouad Примеры великолепны, но, по моему личному мнению, некоторые пояснения тоже были бы полезны. Но каждому свое ;) - person FThompson; 14.06.2012
comment
Намного сложнее, чем мне нужно, но все равно круто. Это очень помогло! Спасибо! - person ; 14.06.2012

В actionPerformed вашего JButton вы можете вызвать JLabel.setIcon(Icon), чтобы установить фоновое изображение.

final JLabel label = new JLabel();
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        label.setIcon(new ImageIcon(SOME_IMAGE));
    }
}
person FThompson    schedule 14.06.2012
comment
Кажется, это работает неправильно. Все еще не меняется метка на кнопке. Я не уверен, почему. - person ; 14.06.2012