Java 如何使用SWT AWT处理Windows按键,最小化窗口并返回桌面
对于我使用SWT(以及更广泛地使用Java)的第一步,我尝试用很少的基本组件制作一个简单的应用程序。这是一个简单的窗口,无需修剪即可实现最大化 现在我想在Windows系统按键上编写一个EventHandler,以隐藏此窗口并返回桌面。意识到SWT.COMMAND仅适用于MacOS后,我替换了:Java 如何使用SWT AWT处理Windows按键,最小化窗口并返回桌面,java,compiler-errors,swt,awt,keypress,Java,Compiler Errors,Swt,Awt,Keypress,对于我使用SWT(以及更广泛地使用Java)的第一步,我尝试用很少的基本组件制作一个简单的应用程序。这是一个简单的窗口,无需修剪即可实现最大化 现在我想在Windows系统按键上编写一个EventHandler,以隐藏此窗口并返回桌面。意识到SWT.COMMAND仅适用于MacOS后,我替换了: import org.eclipse.swt.events.KeyAdapter import org.eclipse.swt.events.KeyAdapter 与 但我仍然得到这个错误: The
import org.eclipse.swt.events.KeyAdapter
import org.eclipse.swt.events.KeyAdapter
与
但我仍然得到这个错误:
The method addKeyListener(KeyListener) in the type Control
is not applicable for the arguments (new KeyAdapter(){})
我不知道发生了什么事。这是我的密码:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class MyApp {
private Shell shell;
private Display display;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
try {
MyApp window = new MyApp();
window.init();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window.
*/
private void init() {
Display display = Display.getDefault();
createContents();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
/**
* Create contents of the window.
*/
private void createContents() {
shell = new Shell(display, SWT.NO_TRIM);
shell.setText("MyApp");
shell.setMaximized(true);
final Image tmp_img_background = new Image(display, "img/background.png");
shell.setBackgroundImage(tmp_img_background);
shell.addKeyListener(new KeyAdapter() {
//@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_WINDOWS) {
shell.setMinimized(true);
}
}
});
shell.addListener(SWT.Resize, new Listener() {
//@Override
public void handleEvent(Event event) {
Rectangle clientArea = shell.getClientArea();
final Image img_background = new Image(display, tmp_img_background.getImageData().scaledTo(clientArea.width, clientArea.height));
shell.setBackgroundImage(img_background);
tmp_img_background.dispose();
}
});
}
}
任何帮助都将不胜感激,谢谢
编辑
我终于找到了一个解决办法来做我所期望的事情。我现在使用AWT/Swing代替SWT
这是我现在使用的代码,除了这次“Windows键”把你带回到桌面之外,它做了同样的事情
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyApp {
private JFrame frame;
private JPanel panel;
private JLabel label;
private ImageIcon imageIcon;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try
{
MyApp window = new MyApp();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MyApp() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame("MyApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);
Dimension frameArea = frame.getSize();
int w = frameArea.width;
int h = frameArea.height;
try
{
panel = new JPanel();
imageIcon = new ImageIcon(
new ImageIcon(panel.getClass().getResource("/background.png"))
.getImage()
.getScaledInstance(w, h, Image.SCALE_DEFAULT)
);
label = new JLabel();
label.setIcon(imageIcon);
frame.setContentPane(label);
}
catch (Exception e)
{
System.out.println("File not found !");
}
frame.addKeyListener(new KeyAdapter() {
//@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_WINDOWS) {
frame.setState(JFrame.ICONIFIED);
}
}
});
}
}
您的编译器正在抱怨,因为您试图将AWT
侦听器
/适配器
添加到SWTShell
。您必须改用org.eclipse.swt.events.KeyAdapter
但是从外观上看,SWT不支持Windows键
是一个错误报告,要求添加对windows密钥的支持。谢谢你,Baz,我理解了我的错误,并最终切换到AWT/Spring来完成这个项目。现在它就像一个魔咒,我可以让我的应用程序全屏显示,没有任何装饰(没有标题栏或边框),并且“Windows键”可以按预期将其最小化。@Twist请将您的代码作为答案发布并接受它,或者将代码添加到您的问题中并接受我的答案。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyApp {
private JFrame frame;
private JPanel panel;
private JLabel label;
private ImageIcon imageIcon;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try
{
MyApp window = new MyApp();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public MyApp() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame("MyApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);
Dimension frameArea = frame.getSize();
int w = frameArea.width;
int h = frameArea.height;
try
{
panel = new JPanel();
imageIcon = new ImageIcon(
new ImageIcon(panel.getClass().getResource("/background.png"))
.getImage()
.getScaledInstance(w, h, Image.SCALE_DEFAULT)
);
label = new JLabel();
label.setIcon(imageIcon);
frame.setContentPane(label);
}
catch (Exception e)
{
System.out.println("File not found !");
}
frame.addKeyListener(new KeyAdapter() {
//@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_WINDOWS) {
frame.setState(JFrame.ICONIFIED);
}
}
});
}
}