Как сделать окно прозрачным, перетаскиваемым и добавить многослойные компоненты?

Я не знаю, как добавить JLabel поверх JPanel. Я хочу отобразить некоторую информацию в метке на мобильном изображении. Изображение находится в папке JPanel. Я уже успел сделать JFrame неукрашенным.

Вывод http://i44.tinypic.com/2mhacsj.png

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

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Window;

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

class Remote extends JFrame {
    JPanel p2;

    private Window Remote;

    public Remote() {
        createAndShowGUI();
    }

    public void createAndShowGUI() {
        // Set title and default close operation
        setTitle("Transparent Panel");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setUndecorated(true);
        p2 = new JPanel();
        JLabel label = new JLabel(new ImageIcon("C://Mobile.png"));
        p2.add(label);
        p2.setPreferredSize(new Dimension(1000, 800));
        add(p2);
        setLayout(new FlowLayout());
        setSize(315, 610);
        setVisible(true);
        setLocation(800, 100);
    }

    public static void main(String args[]) {
        // Run in the EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Remote remote = new Remote();
            }
        });
    }

}

У меня есть 3 вопроса:

  1. Как удалить границы [фона], окружающие мобильный телефон?

  2. Как добавить метку в JPanel?

  3. Как сделать окно подвижным?


person AruLNadhaN    schedule 16.12.2013    source источник
comment
прозрачная версия мобильного   -  person Jens Piegsa    schedule 16.12.2013


Ответы (2)


Это должно соответствовать вашим требованиям:

public void createAndShowGUI() {
    setTitle("Transparent Panel");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    setUndecorated(true);
    AWTUtilities.setWindowOpaque(this, false);

    JLayeredPane layeredPane = new JLayeredPane();
    layeredPane.setBounds(0, 0, 315, 610);

    JLabel mobileImageLabel = new JLabel(new ImageIcon("C://Mobile.png"));
    mobileImageLabel.setBounds(0, 0, 315, 610);
    layeredPane.add(mobileImageLabel, Integer.valueOf(0));

    JLabel textLabel = new JLabel(" Booting... ");
    textLabel.setVerticalAlignment(SwingConstants.TOP);
    textLabel.setForeground(Color.GREEN);
    textLabel.setBounds(26, 59, 263, 495);
    layeredPane.add(textLabel, Integer.valueOf(1));

    setContentPane(layeredPane);

    setSize(315, 610);
    setLocation(800, 100);
    setVisible(true);
}

Для перетаскиваемого окна вызовите этот метод из конструктора Remote():

public void addListeners() {
    final Point offset = new Point();
    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(final MouseEvent e) {
            offset.setLocation(e.getPoint());
        }
    });
    addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(final MouseEvent e) {
            setLocation(e.getXOnScreen()-offset.x, e.getYOnScreen()-offset.y);
        }
    });
}

Дополнительные примечания:

  • вместо JFrame.add() используйте: getContentPane().add() или setContentPane()
  • AWTUtilities.setWindowOpaque() убирает серый фон недекорированной рамки
  • JLayeredPane можно использовать для укладки компонентов друг на друга
  • макет в JLayeredPane приходится делать вручную

Теперь это должно выглядеть примерно так::

результат: прозрачный jframe с изображением и меткой сверху

person Jens Piegsa    schedule 16.12.2013
comment
Новые требования, да? - person Jens Piegsa; 17.12.2013
comment
Предложение: вы можете добавить это к своему вопросу + то, что вы пытались решить эту дополнительную проблему. Я посмотрю на это позже. - person Jens Piegsa; 17.12.2013
comment
@ArulNadhan: Итак, ты пробовал? - person Jens Piegsa; 19.12.2013

Не знаю, правильно ли я понял. Значит нужно убрать строку заголовка и отображать рамку как мобильную?

В этом случае вам нужно сделать следующий код, чтобы удалить строку заголовка

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Already there
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);

и чем вы можете сделать это, чтобы установить фоновое изображение:

setContentPane(new JLabel(new ImageIcon("path/to/image.jpg")));
person Jonathan Mallia    schedule 16.12.2013