java рисовать изображение поверх другого

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

package launcher;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
/**
 * 
 * @author Daniel <Skype: daniel.gusdal>
 *
 * Current Date: 2. feb. 2014 Current Time: 21:46:52
 * Project: 742 client. File Name: Launcher.java
 *
 */
public class Launcher extends JFrame {

    /**
     * Generated serialVersionUID
     */
    private static final long serialVersionUID = 1L;

    private JPanel contentPane;
    static Point mouseDownCompCoords;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    mouseDownCompCoords = null;
                    final Launcher frame = new Launcher();
                    frame.setResizable(true);
                    frame.setUndecorated(true);
                    frame.setBackground(new Color(0, 255, 0, 0));
                    frame.setVisible(true);
                    frame.addMouseListener(new MouseListener() {
                        public void mouseReleased(MouseEvent e) {
                            mouseDownCompCoords = null;
                        }

                        public void mousePressed(MouseEvent e) {
                            mouseDownCompCoords = e.getPoint();
                        }

                        public void mouseExited(MouseEvent e) {
                        }

                        public void mouseEntered(MouseEvent e) {
                        }

                        public void mouseClicked(MouseEvent e) {
                        }
                    });

                    frame.addMouseMotionListener(new MouseMotionListener() {
                        public void mouseMoved(MouseEvent e) {
                        }

                        public void mouseDragged(MouseEvent e) {
                            Point currCoords = e.getLocationOnScreen();
                            frame.setLocation(currCoords.x
                                    - mouseDownCompCoords.x, currCoords.y
                                    - mouseDownCompCoords.y);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Launcher() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 841, 593);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel Design = new JLabel("New label");
        Design.setIcon(new ImageIcon(getClass().getResource("Launcher3.png")));
        Design.setBounds(-158, -22, 1047, 592);
        contentPane.add(Design);

        ImageIcon img = new ImageIcon(getClass().getResource(
                "Playnow.png"));
        final JButton Playnow = new JButton(img);
        Playnow.setBackground(null);
        Playnow.setOpaque(false);

        Playnow.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseEntered(MouseEvent e) {
                Playnow.setIcon(new ImageIcon(getClass().getResource(
                        "PlaynowHover.png")));
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                Playnow.setIcon(new ImageIcon(getClass().getResource(
                        "PlaynowHover.png")));
                System.out.println(Playnow.getIcon());
            }

            @Override
            public void mouseExited(MouseEvent e) {
                Playnow.setIcon(new ImageIcon(getClass().getResource(
                        "Playnow.png")));
            }
        });

        Playnow.setBounds(258, 442, 301, 46);
        contentPane.add(Playnow);

        final JButton Exit = new JButton();
        Exit.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(Exit.getIcon());
                System.exit(0);
            }
        });
        Exit.setIcon(new ImageIcon(Launcher.class.getResource("Exit.png")));
        Exit.setOpaque(false);
        Exit.setBounds(766, 59, 21, 21);
        contentPane.add(Exit);
    }
}

person Daniel    schedule 02.02.2014    source источник


Ответы (1)


  1. Не устанавливайте границ. Научитесь использовать менеджеры компоновки.

  2. Нарисуйте изображение на JPanel вместо JLabel

  3. Поместите JButton на JPanel. Дайте этому JPanel GridBadLayout

  4. Переопределить getPreferredSize() из JPanel.

  5. Для переключения между изображениями вы можете использовать флаг, например boolean icon1, icon2, icon3;. и перекрасьте JPanel в mouseXxx. Что-то вроде этого

    public void mouseClicked(MouseEvent e) {
        icon1 = true;
        icon2 = false;
        icon3 = false;
        imagePanel.repaint();
    }
    ....
    protected void paintComponent(Graphics g) {
        if (icon1) {
            g.drawImage(image1, .....);
        }
        if (icon2) { ... }
        if (icon3) { ... }
    }
    
  6. pack() ваш кадр.

  7. Используйте соглашение об именах Java. переменные начинаются со строчных букв.


Вот пример

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

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.*;
import java.util.logging.*;
import javax.imageio.ImageIO;
import javax.swing.*;


public class TestButtonOverImage {

    public TestButtonOverImage() {
        JFrame frame = new JFrame("Test Card");
        frame.add(new ImagePanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

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

    public class ImagePanel extends JPanel {

        BufferedImage img;

        public ImagePanel() {
            setLayout(new GridBagLayout());
            add(new JButton("StackOverflow Button"));

            try {
                img = ImageIO.read(new URL("http://d8u1nmttd4enu.cloudfront.net/designs/logo-stackoverflow-logo-design-99designs_447080~36d200d82d83d7b2e738cebd2a48de07180cef3a_largecrop"));
            } catch (MalformedURLException ex) {
                Logger.getLogger(TestButtonOverImage.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TestButtonOverImage.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 100, 100, 300, 300, this);
        }

        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }
}
person Paul Samsotha    schedule 02.02.2014
comment
@MadProgrammer, мне лень. ТАК и одновременно смотришь перед игрой Суперкубка :D ... давай, Сихокс! - person Paul Samsotha; 03.02.2014
comment
Кстати, как мне сделать окно прозрачным, чтобы вы могли видеть только изображение? - person Daniel; 05.02.2014
comment
Как заставка? - person Paul Samsotha; 05.02.2014
comment
@ user2229998 для g.drawImage используйте значения drawImage(0, 0, getWidht(), getHeight(), this). Затем для вашего кадра сделайте frame.setUndecorated(true). Это даст вам внешний вид экрана-заставки. Вы можете использовать для этого JDialog или JWindow вместо JFrame - person Paul Samsotha; 05.02.2014
comment
Пробовал, но изображение странное, а фрейм по-прежнему виден prntscr.com/2pq9j6 - person Daniel; 05.02.2014
comment
Добавьте это также. frame.setBackground(new Color(0, 0, 0, 0)); Это должно работать. Работает на меня. Как насчет того, чтобы вы задали этот вопрос в другом вопросе, чтобы я мог ответить на него: D - person Paul Samsotha; 05.02.2014
comment
Задал еще один вопрос: D stackoverflow.com/questions/21581671/jpanel-make -он-прозрачный - person Daniel; 05.02.2014
comment
Вы действительно установили фон на 0, 0, 0, 0, и он все еще выглядит так? Потому что это не для меня - person Paul Samsotha; 05.02.2014
comment
Я сделал это да, странно :/ - person Daniel; 05.02.2014