Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SWT AWT处理Windows按键,最小化窗口并返回桌面_Java_Compiler Errors_Swt_Awt_Keypress - Fatal编程技术网

Java 如何使用SWT AWT处理Windows按键,最小化窗口并返回桌面

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

对于我使用SWT(以及更广泛地使用Java)的第一步,我尝试用很少的基本组件制作一个简单的应用程序。这是一个简单的窗口,无需修剪即可实现最大化

现在我想在Windows系统按键上编写一个EventHandler,以隐藏此窗口并返回桌面。意识到SWT.COMMAND仅适用于MacOS后,我替换了:

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
侦听器
/
适配器
添加到SWT
Shell
。您必须改用
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);
                }
            }
        });
    }
}