2015-02-07 83 views
1

我想知道是否可以爲我的應用程序創建像面板一樣的鎖定屏幕。基本上我有一個用java編寫的程序,我想有一個透明的屏幕(所以用戶仍然可以看到發生了什麼),但除非他使用密碼,否則他什麼也不能做。 我正在考慮在Windows本身上實現此功能,而不是使用Java框架等。 我在互聯網上發現這個圖像,它會是這樣的: LockScreen在我的應用程序上創建「鎖定屏幕」

任何想法,我該如何做到這一點?

+0

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

+0

該應用程序已經完成使用擺動。我只想按照我所描述的方式「鎖定」它。 – 2015-02-07 14:17:40

回答

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:半透明層模糊主層
  • 上層:你的應用
  • 基板的內容的帶有密碼輸入表格或進度條的面板

使層「襯底」變得不透明以讓主圖層可見。此外,襯底消耗鼠標事件以拒絕將它們傳遞到主層。

+0

嗨!感謝您的回覆!我認爲鎖定Windows環境會更好,因爲應用程序將在3個不同的屏幕上運行。我希望鎖定屏幕是透明的,因爲用戶需要查看鎖定屏幕後面的內容。 – 2015-02-09 21:01:54

相關問題