Java 自己的JPOpupMenus显著降低了应用程序的速度

Java 自己的JPOpupMenus显著降低了应用程序的速度,java,performance,swing,jpopupmenu,Java,Performance,Swing,Jpopupmenu,我有个问题,伙计们,请你们帮忙。 我在自己的JPopupMenu中添加了允许更改计算方法的功能,但现在我的整个应用程序都慢了很多,我将其缩小到我制作的以下类: class PopUpTimeCalcMethodChangeClickListener extends MouseAdapter { PopUpMenuTimeCalcMethodChange menu; public void mousePressed(MouseEvent e){ if (e.isPo

我有个问题,伙计们,请你们帮忙。 我在自己的JPopupMenu中添加了允许更改计算方法的功能,但现在我的整个应用程序都慢了很多,我将其缩小到我制作的以下类:

class PopUpTimeCalcMethodChangeClickListener extends MouseAdapter {
    PopUpMenuTimeCalcMethodChange menu;
    public void mousePressed(MouseEvent e){
        if (e.isPopupTrigger())
            doPop(e);
    }

    public void mouseReleased(MouseEvent e){
        if (e.isPopupTrigger())
            doPop(e);
    }

    private void doPop(MouseEvent e){
        if(menu == null)
            menu = new PopUpMenuTimeCalcMethodChange();         
        menu.show(e.getComponent(), 0, 0);
    }
}

class PopUpMenuTimeCalcMethodChange extends JPopupMenu {
    public PopUpMenuTimeCalcMethodChange(){
        final String[] calctyps = {"Calculate by last download","Calculate by average speed"};
        for(int i = 0;i<calctyps.length;i++){
            final JCheckBox setCalcMethod = new JCheckBox(calctyps[i]);
            setCalcMethod.setIconTextGap(15);
            if(Main.TimeLeftCalculationMode == i)
                setCalcMethod.setSelected(true);
            setCalcMethod.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    for(Component c : getmenu().getComponents()){
                        if(c.getClass() == JCheckBox.class){
                            ((JCheckBox) c).setSelected(false);
                        }
                    }
                    setCalcMethod.setSelected(true);
                    System.out.println("lol we are running");
                    int index = -1;
                    for (int i=0;i<calctyps.length;i++) {
                        if (calctyps[i].equals(setCalcMethod.getText())) {
                            index = i;
                            break;
                        }
                    }

                    Main.TimeLeftCalculationMode = index;
                }
            });
            add(setCalcMethod);
        }
    }

    public JPopupMenu getmenu(){
        return this;
    }
}
类PopupTimeCalMethodChangeClickListener扩展了MouseApter{
PopUpMenuTimeCalcMethodChange菜单;
公共无效鼠标按下(MouseEvent e){
如果(如isPopupTrigger())
doPop(e);
}
公共无效MouseEvent(MouseEvent e){
如果(如isPopupTrigger())
doPop(e);
}
私有无效doPop(MouseEvent e){
如果(菜单==null)
menu=new PopUpMenuTimeCalcMethodChange();
show(例如getComponent(),0,0);
}
}
类PopUpMenuTimeCalcMethodChange扩展了JPopupMenu{
公共PopUpMenuTimeCalcMethodChange(){
最终字符串[]calctyps={“按上次下载计算”,“按平均速度计算”};

对于(int i=0;i你确定减速是由你在问题中输入的类引起的吗?如果我接受你的
popupmenUtimeCalMethodChange
类并添加一个简单的
Main
类,应用程序对我来说并没有减速。你注意到减速的程度了吗?你可以在应用程序中的某些点打印时间来获得一些信息度量。您可以添加更多代码以确保问题不在其他地方吗?(您的
PopupMenuTimeCalMethodChangeClickListener
类似乎未被
PopupMenuTimeCalMethodChange
类使用。)

这是我尝试的代码:

// Main class:

import javax.swing.*;

public class Main {
    protected static int TimeLeftCalculationMode;

    public static void main(final String[] arguments) {
        new Main().launchGui();
    }

    private void launchGui() {
        final JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        panel.setComponentPopupMenu(new PopUpMenuTimeCalcMethodChange());
        frame.getContentPane().add(panel);

        frame.setVisible(true);
    }
}


// PopUpMenuTimeCalcMethodChange class:

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

public class PopUpMenuTimeCalcMethodChange extends JPopupMenu {
    public PopUpMenuTimeCalcMethodChange(){
        final String[] calctyps = {"Calculate by last download",
                                   "Calculate by average speed"};
        for(int i = 0;i<calctyps.length;i++){
            final JCheckBox setCalcMethod = new JCheckBox(calctyps[i]);
            setCalcMethod.setIconTextGap(15);
            if(Main.TimeLeftCalculationMode == i)
                setCalcMethod.setSelected(true);
            setCalcMethod.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    for(Component c : getmenu().getComponents()){
                        if(c.getClass() == JCheckBox.class){
                            ((JCheckBox) c).setSelected(false);
                        }
                    }
                    setCalcMethod.setSelected(true);
                    System.out.println("lol we are running");
                    int index = -1;
                    for (int i=0;i<calctyps.length;i++) {
                        if (calctyps[i].equals(setCalcMethod.getText())) {
                            index = i;
                            break;
                        }
                    }

                    Main.TimeLeftCalculationMode = index;
                }
            });
            add(setCalcMethod);
        }
    }

    public JPopupMenu getmenu(){
        return this;
    }
}
//主类:
导入javax.swing.*;
公共班机{
受保护的静态int TimeLeftCalculationMode;
公共静态void main(最终字符串[]参数){
新建Main().launchGui();
}
私有void launchGui(){
最终JFrame=新JFrame(“堆栈溢出”);
机架立根(100100800600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
最终JPanel面板=新JPanel();
panel.setComponentPopupMenu(新的PopupMenuTimeCalMethodChange());
frame.getContentPane().add(面板);
frame.setVisible(true);
}
}
//PopUpMenuTimeCalcMethodChange类:
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类PopUpMenuTimeCalcMethodChange扩展了JPopupMenu{
公共PopUpMenuTimeCalcMethodChange(){
最后一个字符串[]calctyps={“按上次下载计算”,
“按平均速度计算”};

对于(int i=0;如果要更快地获得帮助,请发布一个or。不要创建新的JPopupMenu,只需更改弹出窗口中显示的菜单项。还要使用
JComponent\setComponentPopupMenu
。经过一个下午的尝试和错误后,我很确定提到的类不是唯一的麻烦源,它更像是压碎我的应用程序的最后一滴。t感谢您抽出时间:)祝您在调查这个问题时好运。有几种很好的Java探查器可能会有所帮助。有关建议,请参阅示例。