Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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 JPOppMenu上的JMenuItems有时不是';画_Java_Swing_Jmenuitem_Jpopupmenu - Fatal编程技术网

Java JPOppMenu上的JMenuItems有时不是';画

Java JPOppMenu上的JMenuItems有时不是';画,java,swing,jmenuitem,jpopupmenu,Java,Swing,Jmenuitem,Jpopupmenu,我有一个JPopupMenu,当按下JButton时显示。此菜单包含一系列JMenuItems,每个项都与一个操作关联,有时会更改。我遇到的问题是,JMenuItems没有被绘制,我只是得到一个灰色的JPopupMenu,但是如果我将鼠标光标移到这些项目上,它们就会出现。我认为问题可能在于更改后没有正确地重新绘制组件,但测试表明,即使项目没有更改,问题仍然会发生。以下是相关代码: if (!listChanged) { myPopupMenu.show(myButton,

我有一个JPopupMenu,当按下JButton时显示。此菜单包含一系列JMenuItems,每个项都与一个操作关联,有时会更改。我遇到的问题是,JMenuItems没有被绘制,我只是得到一个灰色的JPopupMenu,但是如果我将鼠标光标移到这些项目上,它们就会出现。我认为问题可能在于更改后没有正确地重新绘制组件,但测试表明,即使项目没有更改,问题仍然会发生。以下是相关代码:

    if (!listChanged) {
        myPopupMenu.show(myButton, x, y);
    } else {
        List<String> menuList = getMenuList();
        MyData data = getData();
        myPopupMenu.removeAll();

        for (int i = 0; i < menuList.size(); i++) {
            String name = menuList.get(i);
            JMenuItem item = new JMenuItem(new MyMenuAction(this, name,
                    data, i));
            item.addActionListener(this);
            myPopupMenu.add(item);
            myPopupMenu.validate();
        }
        myPopupMenu.repaint();
        myPopupMenu.show(myButton, x, y);
    }
...

private static class MyMenuAction extends AbstractAction {
    private MyClass parent;
    private int index;
    private MyData data;

    public MyMenuAction (MyClass parent, String name,
            MyData data, int index) {
        super(name);
        this.parent = parent;
        this.index = index;
        this.data = data;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object[] actionParameters;
        try {
            actionParameters = data.getParameters(index);
        } catch (ImmediateException e1) {
            log(e1.getMessage(), "Error");
            return;
        }
        parent.myButtonAction(actionParameters);
    }

}
如果(!listChanged){
显示(我的按钮,x,y);
}否则{
List menuList=getMenuList();
MyData=getData();
myPopupMenu.removeAll();
对于(int i=0;i
只是想澄清一下,这些操作运行良好,JPopupMenu和所有JMenuItems中的10次中有8次都画对了,但我不明白为什么它们有时不出现(不管列表是否已更改)。任何帮助都将不胜感激

编辑: 好的,按照安德鲁·汤普森的建议,这里有一个简短完整的例子。许多方法已被剥离,但基本方法仍然存在。只需点击并按住“显示菜单”按钮,即可显示JPOPUP菜单。由于问题是间歇性的,因此可能需要执行多次,直到问题发生

package main;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;
import javax.swing.UIManager;

public class MyClass implements ActionListener, MouseListener {
    boolean listChanged = true;
    boolean mousePressed = false;
    long clickStart;
    JPopupMenu myPopupMenu;
    JButton myButton;
    JFrame myFrame;
    ArrayList<String> list;

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.start();
    }

    private void start() {
        myFrame = new JFrame();
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println(e.getClass().getName() + " " + e.getMessage());
        }

        startList();
        myButton = new JButton("SHOW MENU");
        myPopupMenu = new JPopupMenu();

        JToolBar toolbar = new JToolBar();
        toolbar.add(new JButton("Button1"));
        toolbar.add(new JButton("Button2"));
        toolbar.add(new JButton("Button3"));
        toolbar.add(new JButton("Button4"));
        toolbar.add(new JButton("Button5"));
        toolbar.add(myButton);

        myButton.addMouseListener(this);

        toolbar.setBorder(BorderFactory.createEtchedBorder(1));
        JPanel emptyPanel = new JPanel();

        myFrame.add(toolbar, BorderLayout.PAGE_START);
        myFrame.add(emptyPanel, BorderLayout.CENTER);
        myFrame.pack();
        myFrame.setExtendedState(myFrame.getExtendedState()
                | JFrame.MAXIMIZED_BOTH);
        myFrame.setVisible(true);

    }

    public void showMenu() {
        if (!listChanged) {
            myPopupMenu.show(myButton, 0, myButton.getHeight());
        } else {
            listChanged = false;
            List<String> menuList = getMenuList();
            MyData data = getData();
            myPopupMenu.removeAll();

            for (int i = 0; i < menuList.size(); i++) {
                String name = menuList.get(i);
                JMenuItem item = new JMenuItem(new MyMenuAction(this, name,
                        data, i));
                item.addActionListener(this);
                myPopupMenu.add(item);
                myPopupMenu.validate();
            }
            myPopupMenu.repaint();
            myPopupMenu.show(myButton, 0, myButton.getHeight());
        }
    }

    private void startList() {
        list = new ArrayList<String>();
        list.add("Item 1");
        list.add("Item 2");
        list.add("Item 3");
        list.add("Item 4");
        list.add("Item 5");
    }

    private List<String> getMenuList() {
        return list;
    }

    public void myButtonAction() {
        Object[] defaultParameters = getDefaultParameters();
        myButtonAction(defaultParameters);
    }

    private Object[] getDefaultParameters() {
        // Placeholder
        return null;
    }

    public void myButtonAction(Object[] actionParameters) {
        // Placeholder
    }

    private MyData getData() {
        // Placeholder
        return new MyData();
    }

    private void changeList(List<String> newList) {
        list.clear();
        list.addAll(newList);
        listChanged = true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // Placeholder
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (e.getSource() == myButton) {
            mousePressed = true;
            clickStart = System.currentTimeMillis();
            new Thread(new Runnable() {

                @Override
                public void run() {
                    synchronized (this) {
                        while (mousePressed)
                            try {
                                this.wait(10);
                                if (System.currentTimeMillis() - clickStart > 300) {
                                    MyClass.this.showMenu();
                                    return;
                                }
                            } catch (InterruptedException e1) {
                                break;
                            }
                        MyClass.this.myButtonAction();
                    }
                }
            }).start();

        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        mousePressed = false;
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    private static class MyData {

        public Object[] getParameters(int index) {
            // Placeholder
            return null;
        }

    }

    private static class MyMenuAction extends AbstractAction {
        private MyClass parent;
        private int index;
        private MyData data;

        public MyMenuAction(MyClass parent, String name, MyData data, int index) {
            super(name);
            this.parent = parent;
            this.index = index;
            this.data = data;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            Object[] actionParameters;
            try {
                actionParameters = data.getParameters(index);
            } catch (Exception e1) {
                System.out.println(e1.getMessage());
                return;
            }
            parent.myButtonAction(actionParameters);
        }
    }

}
packagemain;
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.AbstractAction;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.jpopmenu;
导入javax.swing.JToolBar;
导入javax.swing.UIManager;
公共类MyClass实现ActionListener、MouseListener{
布尔listChanged=true;
布尔mousePressed=false;
长点击开始;
JPOppMenu myPopupMenu;
JButton-myButton;
JFrame-myFrame;
数组列表;
公共静态void main(字符串[]args){
MyClass MyClass=新的MyClass();
myClass.start();
}
私有void start(){
myFrame=newjframe();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(例外e){
System.out.println(e.getClass().getName()+“”+e.getMessage());
}
惊吓者();
myButton=新的JButton(“显示菜单”);
myPopupMenu=新的JPopupMenu();
JToolBar toolbar=新的JToolBar();
添加(新的JButton(“Button1”);
添加(新的JButton(“Button2”);
添加(新的JButton(“Button3”);
添加(新的JButton(“Button4”);
添加(新的JButton(“Button5”);
工具栏.添加(myButton);
myButton.addMouseListener(这个);
toolbar.setOrder(BorderFactory.createEtchedBorder(1));
JPanel emptyPanel=新的JPanel();
myFrame.add(工具栏、边框布局、页面开始);
添加(emptyPanel,BorderLayout.CENTER);
myFrame.pack();
myFrame.setExtendedState(myFrame.getExtendedState())
|JFrame.MAXIMIZED_两者);
myFrame.setVisible(true);
}
公共void showMenu(){
如果(!listChanged){
显示(myButton,0,myButton.getHeight());
}否则{
listChanged=false;
List menuList=getMenuList();
MyData=getData();
myPopupMenu.removeAll();
对于(int i=0;i