Создание «экрана блокировки» в моем приложении

1

Я хотел бы знать, можно ли создать экран блокировки, например панель для моего приложения. В основном у меня есть программа, написанная в java, и я хотел бы иметь прозрачный экран (так что пользователь все еще может видеть, что происходит), но он ничего не может сделать, если не использует пароль. Я думал о реализации этого на самих окнах и не использовал фреймы Java и так далее. Я нашел это изображение в Интернете, это было бы примерно так: LockScreen

Любые идеи о том, как я могу это сделать?

  • 0
    Подсказка: если вы хотите, чтобы приложение для настольного компьютера использовало Swing, поищите веб-приложение.
  • 0
    Приложение уже сделано с использованием свинга. Я просто хочу «заблокировать», как я описал.
Теги:
lockscreen

1 ответ

0

Вы хотите заблокировать всю среду Windows или просто окно своего приложения?

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

Скорее всего, вы хотите заблокировать только свое окно приложения. Используйте класс javax.swing.JLayeredPane, чтобы нарисовать один слой над другим. Вот пример:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class LockScreen {
  private JPanel substrate;
  private JPanel upperLayer;

  public LockScreen() {
    int width = 500;
    int height = 600;

    final JButton lockButton = new JButton( "Lock" );
    ActionListener actionListener = new ActionListener() {
      @Override
      public void actionPerformed( ActionEvent e ) {
        boolean lock = e.getSource() == lockButton;
        substrate.setVisible( lock );
        upperLayer.setVisible( lock );
      }
    };
    lockButton.addActionListener( actionListener );

    JPanel mainLayer = new JPanel();
    mainLayer.add( lockButton );
    mainLayer.add( new JButton( "Button" ) );
    mainLayer.add( new JLabel( "Label" ) );
    mainLayer.setBounds( 0, 0, width, height );

    final Color transparentWhite = new Color( 255, 255, 255, 127 );
    substrate = new JPanel() {
      @Override
      public void paint( Graphics g ) {
        g.setColor( transparentWhite );
        g.fillRect( 0, 0, getWidth(), getHeight() );
      }
    };
    substrate.setOpaque( false );
    substrate.setBounds( 0, 0, width, height );
    substrate.addMouseListener( new MouseAdapter() {} );
    substrate.setVisible( false );

    JButton unlockButton = new JButton( "Unlock" );
    unlockButton.addActionListener( actionListener );

    upperLayer = new JPanel();
    upperLayer.setBounds( width / 2 - 50, height / 2 - 50, 100, 100 );
    upperLayer.setBorder( new LineBorder( Color.BLACK, 1 ) );
    upperLayer.add( unlockButton );
    upperLayer.setVisible( false );

    JLayeredPane layeredPane = new JLayeredPane();
    layeredPane.setLayout( null );
    layeredPane.setLayer( mainLayer, 0 );
    layeredPane.add( mainLayer );
    layeredPane.setLayer( substrate, 1 );
    layeredPane.add( substrate );
    layeredPane.setLayer( upperLayer, 2 );
    layeredPane.add( upperLayer );

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setBounds( ( screenSize.width - width ) / 2, ( screenSize.height - height ) / 2, width, height );
    frame.add( layeredPane );
    frame.setVisible( true );
  }

  public static void main( String args[] ) {
    new LockScreen();
  }
}

Используются три слоя:

  • mainLayer: содержимое вашего приложения
  • субстрат: полупрозрачный слой для размытия основного слоя
  • upperLayer: панель с формой ввода пароля или индикатором выполнения

Слой "подложка" становится непрозрачным, чтобы можно было видеть основной слой. Кроме того, субстрат потребляет события мыши, чтобы отказаться от передачи их на основной уровень.

  • 0
    Привет! Спасибо за ваш ответ! Я думаю, что лучше блокировать среду Windows, потому что приложение будет работать на 3 разных экранах. Я хочу, чтобы экран блокировки был прозрачным, потому что пользователь должен видеть, что происходит за экраном блокировки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню