【问题标题】:Creating a "lock screen" on my application在我的应用程序上创建“锁定屏幕”
【发布时间】:2015-02-07 14:10:57
【问题描述】:

我想知道是否可以为我的应用程序创建一个类似面板的锁定屏幕。基本上我有一个用java编写的程序,我想有一个透明的屏幕(所以用户仍然可以看到发生了什么),但除非他使用密码,否则他什么也做不了。 我正在考虑在 Windows 本身上实现这一点,而不是使用 Java 框架等。 我在网上找到这张图,大概是这样的: LockScreen

关于如何做到这一点的任何想法?

【问题讨论】:

  • 提示:如果你想要桌面应用程序使用 swing 否则寻找网络应用程序。
  • 该应用已经使用 swing 完成。我只是想按照我描述的方式“锁定”它。

标签: java lockscreen


【解决方案1】:

您想锁定整个 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:应用程序的内容
  • substrate: 半透明层来模糊主层
  • upperLayer:带有密码输入表单或进度条的面板

“substrate”层是不透明的,让主层可见。此外,substrate 消耗鼠标事件以拒绝将它们传递到主级别。

【讨论】:

  • 您好!感谢您的回复!我认为最好锁定 windows 环境,因为应用程序将在 3 个不同的屏幕上运行。我希望锁屏是透明的,因为用户需要看到锁屏后面发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多