在我的应用程序上创建“锁定屏幕”
问题描述:
我想知道是否可以为我的应用程序创建像面板一样的锁定屏幕。基本上我有一个用java编写的程序,我想有一个透明的屏幕(所以用户仍然可以看到发生了什么),但除非他使用密码,否则他什么也不能做。 我正在考虑在Windows本身上实现此功能,而不是使用Java框架等。 我在互联网上发现这个图像,它会是这样的: LockScreen在我的应用程序上创建“锁定屏幕”
任何想法,我该如何做到这一点?
答
你想锁定整个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
提示:如果您希望桌面应用程序使用swing,则可以查找Web应用程序。 – SMA 2015-02-07 14:13:09
该应用程序已经完成使用摆动。我只想按照我所描述的方式“锁定”它。 – 2015-02-07 14:17:40