Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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 单击背景jFrame后,JPOppMenu未隐藏_Java_Swing_Jcheckbox_Jpopupmenu - Fatal编程技术网

Java 单击背景jFrame后,JPOppMenu未隐藏

Java 单击背景jFrame后,JPOppMenu未隐藏,java,swing,jcheckbox,jpopupmenu,Java,Swing,Jcheckbox,Jpopupmenu,我使用的是一个jpopumenu,它包含多个jCheckBoxMenuItem。用户可以选中/取消选中多个复选框。但是当我点击JFrame时,PopupMenu并没有隐藏。 这是完整的代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PopupTest extends JFrame { JButton button1; public PopupTest() { setT

我使用的是一个
jpopumenu
,它包含多个
jCheckBoxMenuItem
。用户可以选中/取消选中多个
复选框
。但是当我点击
JFrame
时,
PopupMenu
并没有隐藏。 这是完整的代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PopupTest extends JFrame {

JButton button1;

public PopupTest() {
    setTitle("Popup Test !");
    setSize(400, 400);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new FlowLayout());

    button1 = new JButton("Click me!");
    button1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int count = 250; // this count value is dynamic
            JPopupMenu menu = new JPopupMenu();
            JCheckBoxMenuItem item = null;
            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            JScrollPane scrollPane = new JScrollPane(panel,
                    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollPane.setPreferredSize(new Dimension(125, 200));
            for (int i = 1; i <= count; i++) {
                item = new JCheckBoxMenuItem("Page : " + i, new ImageIcon("test.png"));
                item.setHorizontalTextPosition(JMenuItem.RIGHT);
                item.addActionListener(new OpenAction(menu, button1));
                panel.add(item);
            }
            menu.add(scrollPane);
            JCheckBoxMenuItem selectAll = new JCheckBoxMenuItem("Select All", new ImageIcon("test.png"));
            selectAll.addActionListener(new OpenAction(menu, button1));
            menu.insert(selectAll, 0);

            if (!menu.isVisible()) {
                Point p = button1.getLocationOnScreen();
                menu.setLocation((int) p.getX(), (int) p.getY() + button1.getHeight());
                menu.setVisible(true);
            } else {
                menu.setVisible(false);
            }
        }
    });
    add(button1);
}

private static class OpenAction implements ActionListener {

    private JPopupMenu menu;
    private JButton button;

    private OpenAction(JPopupMenu menu, JButton button) {
        this.menu = menu;
        this.button = button;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String chkBoxText = e.getActionCommand().toString();
        AbstractButton aButton = (AbstractButton) e.getSource();
        boolean selected = aButton.getModel().isSelected();
        Icon checkedIcon = new ImageIcon("test1.png");
        Icon uncheckedIcon = new ImageIcon("test.png");

        JScrollPane pane = null;
        JViewport viewport = null;
        JPanel panel = null;
        JCheckBoxMenuItem item = null;

        pane = (JScrollPane) menu.getComponent(1); //0th component is "Select All" check box
        viewport = pane.getViewport();
        panel = (JPanel) viewport.getComponent(0);
        int totalChkBoxComponent = panel.getComponentCount();

        if (selected) {
            System.out.println(chkBoxText + " is Checked!");
            if (chkBoxText.trim().equalsIgnoreCase("select all")) {
                for (int i = 0; i < totalChkBoxComponent; i++) {
                    item = (JCheckBoxMenuItem) panel.getComponent(i);
                    item.setSelected(selected);
                    item.setIcon(item.isSelected() ? checkedIcon : uncheckedIcon);
                }
            }
        } else if (!selected) {
            System.out.println(chkBoxText + " is Un-Checked!");
            if (chkBoxText.trim().equalsIgnoreCase("select all")) {
                for (int i = 0; i < totalChkBoxComponent; i++) {
                    item = (JCheckBoxMenuItem) panel.getComponent(i);
                    item.setSelected(selected);
                    item.setIcon(item.isSelected() ? checkedIcon : uncheckedIcon);
                }
            } else { // this is for, after checking "Select All", if any other is unchecked, then "Select ALL" should be unchecked.
                item = (JCheckBoxMenuItem) menu.getComponent(0);
                item.setSelected(selected);
                item.setIcon(selected ? checkedIcon : uncheckedIcon);
            }
        }
        aButton.setIcon(aButton.isSelected() ? checkedIcon : uncheckedIcon);
    }
}

public static void main(String args[]) {
    new PopupTest();
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类poputest扩展了JFrame{
按钮1;
公共弹出测试(){
setTitle(“弹出测试!”);
设置大小(400400);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
setLayout(新的FlowLayout());
button1=新的JButton(“单击我!”);
button1.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
int count=250;//此计数值是动态的
JPopupMenu=newjpopupmenu();
JCheckBoxMenuItem item=null;
JPanel面板=新的JPanel();
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
JScrollPane scrollPane=新的JScrollPane(面板,
JScrollPane.VERTICAL\u滚动条\u始终,
JScrollPane.HORIZONTAL\u SCROLLBAR\u NEVER);
scrollPane.setPreferredSize(新维度(125200));

对于(int i=1;i首先,您的代码并不是执行此操作的最佳方式。您不应该每次单击按钮时都创建一个新菜单,而是创建一次并将其作为字段保留引用

PopupMenu
没有隐藏的原因是您显式调用了
setVisible(true);
并尝试在分配给按钮而不是框架的同一个
ActionListener
中执行
setVisible(false);

你可以: 1.在框架中添加另一个侦听器,以便在单击时将菜单可见性设置为
false
2.使用
show
方法代替
setVisible

menu.show(button1, 0, button1.getHeight());
而不是

menu.setLocation((int) p.getX(), (int) p.getY() + button1.getHeight());
menu.setVisible(true);

然而,在我们的例子中,这会导致菜单消失的其他问题。我认为最好的方法是重新设计代码。

+1………..nice hackmenu.show不起作用。如果我使用它,则弹出窗口会自动隐藏在鼠标上方。