2015-11-20 26 views
0

那麼我有一個問題的傢伙,並要求你的幫助。 我在我自己的一種JPopupMenu中的添加到允許改變計算方法,但現在我的整個應用程序顯著slowen下來,我把範圍縮小到這一類我提出:自己的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,即使它不再可見。我假設它有關於行動者的事情,但我不確定。

+2

爲了更好地幫助更快,發佈[MCVE]或[短,自成一體,正確示例](http://www.sscce.org/)。 –

+2

不要創建新的JPopupMenu,只需更改彈出窗口中顯示的菜單項。 – camickr

+0

也使用'JComponent#setComponentPopupMenu' – MadProgrammer

回答

0

您確定放緩是由您在問題中提出的類引起的嗎?如果我拿你的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; 
    } 
} 
+0

經過一整個下午的嘗試和錯誤我很確定提及類不是唯一的麻煩來源,它更像最後一滴粉碎我的應用程序。謝謝你提供你的時間:) –

+0

祝你好運,調查問題。有幾個好的Java分析器可能會有所幫助。請參閱[開源Java Profiler](http://stackoverflow.com/questions/948549/open-source-java-profilers)以獲取建議。 –

相關問題