在我的应用程序上创建“锁定屏幕”

问题描述:

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

任何想法,我该如何做到这一点?

+0

提示:如果您希望桌面应用程序使用swing,则可以查找Web应用程序。 – SMA 2015-02-07 14:13:09

+0

该应用程序已经完成使用摆动。我只想按照我所描述的方式“锁定”它。 – 2015-02-07 14:17:40

你想锁定整个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:半透明层模糊主层
  • 上层:你的应用
  • 基板的内容的带有密码输入表格或进度条的面板

使层“衬底”变得不透明以让主图层可见。此外,衬底消耗鼠标事件以拒绝将它们传递到主层。

+0

嗨!感谢您的回复!我认为锁定Windows环境会更好,因为应用程序将在3个不同的屏幕上运行。我希望锁定屏幕是透明的,因为用户需要查看锁定屏幕后面的内容。 – 2015-02-09 21:01:54