0

对于我使用 SWT(以及更普遍地使用 Java)的第一步,我尝试使用很少的基本组件制作一个简单的应用程序。这是一个使用 NO_TRIM 最大化的简单窗口。

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

import org.eclipse.swt.events.KeyAdapter
import org.eclipse.swt.events.KeyAdapter

import java.awt.event.KeyAdapter
import java.awt.event.KeyEvent

但我仍然收到此错误:

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);
                }
            }
        });
    }
}
4

1 回答 1

2

您的编译器正在抱怨,因为您试图将 AWT Listener/添加Adapter到 SWT Shell。您将不得不使用 aorg.eclipse.swt.events.KeyAdapter代替。

但是,从表面上看,SWT 不支持 Windows 键。

是一个错误报告,要求添加对 windows 键的支持。

于 2013-05-09T07:14:19.183 回答