1

知道如何以一种好的方式同时显示多个弹出菜单吗?(对于JPopupMenu)我尝试@Override show(Component invoker, int x, int y)并设法通过删除setInvoker(invoker);. 问题在于我无法以任何方式删除弹出窗口。

问题:知道如何JPopupMenu在显示更多 s 时使 s 仍然可见,JPopupMenu但否则照常工作(关闭/隐藏其他操作)?

public class MultiPopupMenu {

    public static void main(String[] args){

        // Create popup
        JPopupMenu menu1 = createPopupMenu("First label");
        JPopupMenu menu2 = createPopupMenu("Second label");

        // Create labels
        JLabel label1 = new JLabel("abcde");
        JLabel label2 = new JLabel("1234");

        JPanel panel = new JPanel();
        panel.add(label1);
        panel.add(label2);

        // Add labels
        JFrame frame = new JFrame();
        frame.add(panel);

        frame.setPreferredSize(new Dimension(200,100));
        frame.pack();
        frame.setVisible(true);

        // Show popups
        menu1.show(label1,-40,20); // Not showing
        menu2.show(label2, 0,20);
    }

    private static JPopupMenu createPopupMenu(String label){
        JPopupMenu popup = new JPopupMenu();
        JLabel lblTest = new JLabel(label);
        popup.add(lblTest);
        popup.setBackground(Color.YELLOW);
        return popup;
    }
}
4

2 回答 2

2
  • 在当前的 Swing 中不可能同时显示两个轻量级弹出容器,第二个弹出容器 hide() 首先立即(更改/自 Java4 以来)

  • 创建 JWindow(JTextComponents 不可编辑)或未修饰的 JDialog 并覆盖

    1. setVisible 用于转义键(添加 KeyBindings)和 focusLost /(更好)WindowFocusListener

    2. 在那里添加带有 JButtons 的 JPanel(触发 setVisible 作为第一行代码,其余部分被包装到 invokeLater 中,由 invokeLater 延迟)

    3. 然后你可以把 JComboBox 作为 JMenuItem (不可能在我的第一句中看到描述)

于 2013-06-05T10:25:22.513 回答
1
public class MultiPopupMenu {

    public static void main(String[] args){

        // Create popup
        JWindow popup1 = createPopup("First label");
        JWindow popup2 = createPopup("Second label");

        // Create labels
        JLabel label1 = new JLabel("abcde");
        JLabel label2 = new JLabel("1234");

        JPanel panel = new JPanel();
        panel.add(label1);
        panel.add(label2);

        // Add labels
        JFrame frame = new JFrame();
        frame.add(panel);

        frame.setPreferredSize(new Dimension(200,100));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        // Show popups
        popup1.pack();
        popup2.pack();

        Point floc = frame.getLocation();
        Point loc = label1.getLocation();
        System.out.println(floc);
        popup1.setLocation((int)(floc.getX()+loc.getX())-20, (int)(floc.getY()+loc.getY())+40);
        loc = label2.getLocation();
        popup2.setLocation((int)(floc.getX()+loc.getX())+20, (int)(floc.getY()+loc.getY())+40);

        popup1.setBackground(Color.YELLOW);
        popup1.setVisible(true);
        popup2.setVisible(true);
    }

    private static JWindow createPopup(String label){
        JWindow popup = new JWindow();
        JLabel lblTest = new JLabel(label);
        popup.add(lblTest);
        popup.getContentPane().setBackground(Color.YELLOW);
        return popup;
    }
}
于 2013-06-05T11:33:37.347 回答