如何在弹出菜单中添加文本字段?

时间:2018-07-21 19:54:47

标签: java awt

我尝试搜索我在任何地方都找不到答案。这里是我只想在弹出菜单中包含TextField的代码,以便从该文本字段访问字符串。

package systemtray;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

public class Main {

   public static void main(String[] args) throws AWTException {

  PopupMenu popMenu= new PopupMenu();
  MenuItem item1 = new MenuItem("Exit");
  popMenu.add(item1);
  Image img = Toolkit.getDefaultToolkit().getImage("C:/java/cup.jpg");
  TrayIcon trayIcon = new TrayIcon(img, "Application Name", popMenu);
  SystemTray.getSystemTray().add(trayIcon);
 }
}

1 个答案:

答案 0 :(得分:0)

菜单容器通常不适用于显示文本字段之类的显示输入组件,此外,PopupMenu是基于AWT的组件,只会使问题复杂化。

更好的解决方案是简单地“伪造”它,但是问题就变成了“如何做”。

一种方法可能是将MouseListener附加到TrayIcon上,并在mouseClicked事件上显示未装饰的帧。

这里的技巧是试图找出显示弹出窗口的“位置”,因为您无法(轻松地)获取TrayIcon的屏幕坐标

All your file belong to us

import java.awt.AWTException;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TestTaskIcon {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                Image img = null;
                try {
                    img = ImageIO.read(TestTaskIcon.class.getResource("TaskIcon.png"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                TrayIcon ti = new TrayIcon(img, "Tooltip");
                ti.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        Rectangle bounds = getSafeScreenBounds(e.getPoint());
                        JFrame popup = new JFrame();
                        popup.setUndecorated(true);
                        popup.setAlwaysOnTop(true);
                        popup.setLayout(new FlowLayout());
                        popup.add(new JLabel("Password: "));
                        popup.add(new JTextField(20));
                        popup.pack();

                        popup.addWindowFocusListener(new WindowFocusListener() {
                            @Override
                            public void windowGainedFocus(WindowEvent e) {
                            }

                            @Override
                            public void windowLostFocus(WindowEvent e) {
                                popup.dispose();
                            }
                        });

                        Point point = e.getPoint();

                        int x = point.x;
                        int y = point.y;
                        if (y < bounds.y) {
                            y = bounds.y;
                        } else if (y > bounds.y + bounds.height) {
                            y = bounds.y + bounds.height;
                        }
                        if (x < bounds.x) {
                            x = bounds.x;
                        } else if (x > bounds.x + bounds.width) {
                            x = bounds.x + bounds.width;
                        }

                        if (x + popup.getPreferredSize().width > bounds.x + bounds.width) {
                            x = (bounds.x + bounds.width) - popup.getPreferredSize().width;
                        }
                        if (y + popup.getPreferredSize().height > bounds.y + bounds.height) {
                            y = (bounds.y + bounds.height) - popup.getPreferredSize().height;
                        }
                        popup.setLocation(x, y);
                        popup.setVisible(true);
                    }
                });
                try {
                    SystemTray.getSystemTray().add(ti);
                } catch (AWTException ex) {
                    Logger.getLogger(TestTaskIcon.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    public static Rectangle getSafeScreenBounds(Point pos) {

        Rectangle bounds = getScreenBoundsAt(pos);
        Insets insets = getScreenInsetsAt(pos);

        bounds.x += insets.left;
        bounds.y += insets.top;
        bounds.width -= (insets.left + insets.right);
        bounds.height -= (insets.top + insets.bottom);

        return bounds;

    }

    public static Insets getScreenInsetsAt(Point pos) {
        GraphicsDevice gd = getGraphicsDeviceAt(pos);
        Insets insets = null;
        if (gd != null) {
            insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());
        }
        return insets;
    }

    public static Rectangle getScreenBoundsAt(Point pos) {
        GraphicsDevice gd = getGraphicsDeviceAt(pos);
        Rectangle bounds = null;
        if (gd != null) {
            bounds = gd.getDefaultConfiguration().getBounds();
        }
        return bounds;
    }

    public static GraphicsDevice getGraphicsDeviceAt(Point pos) {

        GraphicsDevice device = null;

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice lstGDs[] = ge.getScreenDevices();

        ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length);

        for (GraphicsDevice gd : lstGDs) {

            GraphicsConfiguration gc = gd.getDefaultConfiguration();
            Rectangle screenBounds = gc.getBounds();

            if (screenBounds.contains(pos)) {

                lstDevices.add(gd);

            }

        }

        if (lstDevices.size() > 0) {
            device = lstDevices.get(0);
        } else {
            device = ge.getDefaultScreenDevice();
        }

        return device;

    }
}
相关问题