Безопасный режим рабочего стола для Java-приложения
Кто-нибудь сейчас знает, как добиться "режима безопасного рабочего стола" (эффекта), подобного тому, который получается из блоков согласия Windows Vista/7 UAC?
Я предполагаю, что это какая-то функция, которая удаляет пиксели здесь и там (и, возможно, их затенение), а затем, наконец, выводит это на экран... Я бы хотела применить его к своему приложению, чтобы пользователь ничего не делал до следующего пользователь подключается к системе (но это не главное)
Буду очень признателен за совет.
С уважением
РЕДАКТИРОВАТЬ: я действительно только искал это
graphicsFX.setColor(new Color(0, 0, 0, 0.8f));
graphicsFX.fillRect(0, 0, 800, 600);
отсрочку ввода я могу сделать довольно хорошо...
Спасибо за все....
2 ответа
Мы используем JXLayer для этой конкретной цели...
Это действительно полезно, так как блокирует пользователя из данного контейнера без блокировки приложения, как GlassPane
решение делает. Это как стеклянная панель для контейнеров;)
Я украл основную идею для здесь
public class JXLayerTest {
public static void main(String[] args) {
new JXLayerTest();
}
public JXLayerTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
final LockableUI ui = new LockableUI();
JPanel panel = new JPanel(new GridBagLayout());
buildUI(panel);
// This stolen directly from the JXLayer lockable blog
JXLayer layer = new JXLayer(panel, ui);
// Java2D grayScale BufferedImageOp
ColorConvertOp grayScale = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
// wrap it with the jxlayer's BufferedImageOpEffect
BufferedImageOpEffect effect = new BufferedImageOpEffect(grayScale);
// set it as the locked effect
ui.setLockedEffects(effect);
ui.setLocked(false);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(layer);
JPanel panelButtons = new JPanel(new GridBagLayout());
final JButton lock = new JButton("Lock");
lock.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean locked = !ui.isLocked();
ui.setLocked(locked);
lock.setText(locked ? "Unlock" : "Lock");
}
});
panelButtons.add(lock);
frame.add(panelButtons, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
protected void buildUI(JPanel panel) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
JLabel label = new JLabel();
try {
BufferedImage image = ImageIO.read(new File("megatokyo.png"));
label.setIcon(new ImageIcon(image));
} catch (IOException ex) {
label.setText("Nothing to see here");
}
panel.add(label, gbc);
JButton button = new JButton("Clickl me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Clicked");
}
});
gbc.gridy++;
panel.add(button, gbc);
}
});
}
}
Вместо того, чтобы изобретать велосипед, попробуйте использовать setEnabled(false)
на компоненте, чтобы отключить его, и когда соединение с системой установлено setEnabled(true)
чтобы снова включить компонент.
Посмотрите этот пример для более подробной информации, которая показывает серый / не кликабельный JButton
: