拥有JPopupMenu会显著降低应用程序的速度



伙计们,我遇到了一个问题,请你们帮忙。我在自己的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;
    }
}

主要的问题是,代码在ui第一次执行后减慢了它的速度,尽管它已经不可见了。我想这是关于动作听众的,但我不确定。

你确定减速是由你在问题中放入的类引起的吗?如果我取你的PopUpMenuTimeCalcMethodChange类并添加一个简单的Main类,那么应用程序对我来说并没有变慢。你注意到变慢了多少?您可以在应用程序中的某些点打印时间以获得一些测量值。你能添加更多的代码来确保问题不在其他地方吗?(您的PopUpTimeCalcMethodChangeClickListener类似乎未被PopUpMenuTimeCalcMethodChange类使用。)

这是我尝试过的代码:

// 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;
    }
}

最新更新