2017-05-26 19 views
-2

摇摆需要英特尔的酷睿i7里面

70%的CPU我有两个组件类,其是覆盖public void paint(Graphics g)方法。
类:
的Java Swing需要我的CPU的40-70%

package com.niton.UI.comps.draggrafix; 
import com.niton.usagecomps.draglogic.basic.DragItem; 

public abstract class DragItemComp extends JPanel { 
    private static final long serialVersionUID = -5963637215146534947L; 
    private DragItem item; 
    /** 
    * Height of the content 
    */ 
    private int dragHeight = 50; 
    /** 
    * Height of the header 
    */ 
    private int topHeight = 23; 
    /** 
    * width of the content 
    */ 
    private int contentSize = 300; 
    /** 
    * the width of the bar 
    */ 
    private int barWidth = 20; 
    private int oldX; 
    private int oldY; 
    private Rectangle blueBtn = new Rectangle(0, 0, barWidth, topHeight); 
    private Rectangle redBtn = new Rectangle(contentSize+barWidth, 0, barWidth, topHeight); 
    private Rectangle namespace = new Rectangle(barWidth, 0, contentSize, topHeight); 
    private ArrayList<ConnectPoint> redPossible = new ArrayList<>(); 
    private ArrayList<ConnectPoint> bluePossible = new ArrayList<>(); 
    private ArrayList<ConnectPoint> redVisible = new ArrayList<>(); 
    private ArrayList<ConnectPoint> blueVisible = new ArrayList<>(); 
    private ArrayList<ConnectPoint> actual; 
    private Font f; 
    private Color contentColor = new Color(getMainColor().getRGB()-50); 
    public Dimension neededSize = new Dimension(barWidth*2+contentSize, dragHeight+topHeight); 
    private MouseAdapter butListener = new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      if(blueBtn.contains(e.getPoint())) 
       actual = bluePossible; 
      else if (redBtn.contains(e.getPoint())) 
       actual = redPossible; 
      else{ 
       //TODO do something 
       return; 
      } 
      if(possibleList != null && possibleList.isVisible()) 
       possibleList.dispose(); 
      possibleList = new JFrame(); 
      possibleList.setAlwaysOnTop(true); 
      possibleList.setType(Type.UTILITY); 
      possibleList.getContentPane().setBackground(Color.LIGHT_GRAY); 
      int height = 8; 
      for (ConnectPoint connectPoint : actual) { 
       connectPoint.setLocation(15, height); 
       possibleList.getContentPane().add(connectPoint); 
       height += connectPoint.getHeight()+8; 
       possibleList.getContentPane().add(new JSeparator()); 
      } 
      possibleList.setLocation(e.getLocationOnScreen()); 
      possibleList.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        possibleList.dispose(); 
       } 
      }); 
      possibleList.setSize(200, height); 
      possibleList.setUndecorated(true); 
      possibleList.setVisible(true); 
      actual = null; 
      setPreferredSize(neededSize); 
     } 
    }; 
    public JFrame possibleList; 
    public DragItemComp() { 
     setBackground(new Color(0, 0, 0, 0)); 
     createComps(); 
     addMouseListener(butListener); 
     f = new Font(getFont().getFontName(), Font.BOLD, 14); 
    } 
    public void createComps(){ 
     removeAll(); 
     int h = 0; 
     for (ConnectPoint connectPoint : blueVisible) { 
      connectPoint.setLocation(0, h); 
      h += connectPoint.getHeight()+6; 
     } 
    } 
    public void onMove(){ 
     if(possibleList == null || !possibleList.isVisible()){ 
      System.out.println("Frame == null"); 
      return; 
     } 
     if(oldX == 0 && oldY== 0){ 
      oldX = getLocationOnScreen().x; 
      oldY = getLocationOnScreen().y; 
     } 
     int tomoveX = getLocationOnScreen().x-oldX; 
     int tomoveY = getLocationOnScreen().y-oldY; 
     Point newPoint = possibleList.getLocation(); 
     newPoint.translate(tomoveX, tomoveY); 
     possibleList.setLocation(newPoint); 
     possibleList.repaint(); 
     System.gc(); 
     oldX = getLocationOnScreen().x; 
     oldY = getLocationOnScreen().y; 
    } 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     /*Blue Button*/ 
     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, barWidth, topHeight); 
     /*Blue Button*/ 

     /*NameBar*/ 
     g.setColor(getMainColor()); 
     g.fillRect(barWidth, 0, contentSize, topHeight); 
     /*nameBar*/ 

     /*red Button*/ 
     g.setColor(Color.RED); 
     g.fillRect(contentSize+barWidth, 0, barWidth, topHeight); 
     /*Red Button*/ 

     /*Content*/ 
     g.setColor(contentColor); 
     g.fillRect(barWidth, topHeight, contentSize, dragHeight); 
     /*Content*/ 

     /*Title*/ 
     g.setColor(Color.BLACK); 
     g.setFont(f); 
     int textSize = 14*getTitle().length(); 
     g.drawString(getTitle(), ((contentSize+(2*barWidth))/2)-(textSize/3), 15); 
     /*Title*/ 

     /*Blue Sidebar*/ 
     g.setColor(Color.BLUE.darker().darker()); 
     g.fillRect(0, topHeight, barWidth, dragHeight); 
     /*Blue Sidebar*/ 

     /*Red Bar*/ 
     g.setColor(Color.red.darker().darker()); 
     g.fillRect(barWidth+contentSize, topHeight, barWidth, dragHeight); 
     /*Red Sidebar*/ 
     //SIZE 
     neededSize = new Dimension(barWidth*2+contentSize, dragHeight+topHeight); 
     setPreferredSize(neededSize); 
     System.gc(); 
    } 
    public abstract Color getMainColor(); 
    public abstract String getTitle(); 
    public class ConnectPoint extends JPanel{ 
     private static final long serialVersionUID = -6834760334640389791L; 
     boolean out = true; 
     String text; 
     private Font f; 
     public ConnectPoint(String text,Runnable onClick) 
     { 
      this.text = text; 
      setSize(text.length()*getFont().getSize()+20, 15); 
      setBackground(new Color(0, 0, 0, 0)); 
      addMouseListener(new MouseAdapter(){ 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        System.out.println("Click"); 
        new Thread(onClick).start(); 
        DragItemComp.this.redPossible.remove(this); 
        DragItemComp.this.redVisible.add(ConnectPoint.this); 
       } 
      }); 
      addKeyListener(new KeyAdapter() { 
       @Override 
       public void keyPressed(KeyEvent e) { 
        if(e.getKeyCode() == KeyEvent.VK_ESCAPE) 
         getParent().setVisible(false); 
       } 
      }); 
      f = new Font(getParent().getFont().getFontName(), getFont().getStyle(), 12); 
     } 
     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      if(out) 
       g.setColor(Color.RED); 
      else 
       g.setColor(Color.BLUE); 
      g.fillOval(0, 0, 10, 10); 
      g.setColor(Color.BLACK); 
      g.setFont(f); 
      g.drawString(text, 15, 11); 
     } 
     @Override 
     public boolean isFocusable() { 
      return true; 
     } 
     @Override 
     public boolean isFocusTraversable() { 
      return true; 
     } 
    } 
} 

我知道这是一个很大的代码和我对不起它。
我尝试解决这个问题很长一段时间。
在这段时间我发现了一些有趣的东西。
我认为,泄漏发生在这个类:

public class JavaScriptDropFileComponent extends JPanel { 
    private static final long serialVersionUID = 3535239632114792374L; 
    private DragJavaScriptFile file; 
    private String project; 
    private DragItem nextPlace; 
    private DragItem selected; 
    protected JFrame placeFrame; 
    public JavaScriptDropFileComponent() { 
     setLayout(new GridLayout(0, 1, 0, 0)); 
     placeFrame = new JFrame(); 
     placeFrame.getContentPane().setLayout(new FlowLayout()); 
     placeFrame.setUndecorated(true); 
     placeFrame.setOpacity(0.5F); 
     placeFrame.getContentPane().setBackground(new Color(0, 0, 0, 0)); 
     placeFrame.setType(Type.UTILITY); 
     placeFrame.setVisible(true); 
     placeFrame.setAlwaysOnTop(true); 
     JSplitPane splitPane = new JSplitPane(); 
     add(splitPane); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.BLACK); 
     splitPane.setLeftComponent(panel); 
     GridBagLayout gbl_panel = new GridBagLayout(); 
     gbl_panel.columnWidths = new int[]{0, 0}; 
     gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0}; 
     gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; 
     gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; 
     panel.setLayout(gbl_panel); 

     JLabel lblComponents = new JLabel("Components"); 
     lblComponents.setForeground(Color.LIGHT_GRAY); 
     lblComponents.setFont(new Font("Roboto Light", Font.PLAIN, 24)); 
     GridBagConstraints gbc_lblComponents = new GridBagConstraints(); 
     gbc_lblComponents.anchor = GridBagConstraints.NORTH; 
     gbc_lblComponents.insets = new Insets(0, 0, 5, 0); 
     gbc_lblComponents.gridx = 0; 
     gbc_lblComponents.gridy = 0; 
     panel.add(lblComponents, gbc_lblComponents); 

     JPanel panel_2 = new JPanel(); 
     panel_2.setBorder(new LineBorder(Color.WHITE, 1, true)); 
     panel_2.setBackground(Color.DARK_GRAY); 
     GridBagConstraints gbc_panel_2 = new GridBagConstraints(); 
     gbc_panel_2.fill = GridBagConstraints.HORIZONTAL; 
     gbc_panel_2.anchor = GridBagConstraints.NORTH; 
     gbc_panel_2.insets = new Insets(0, 0, 5, 0); 
     gbc_panel_2.gridx = 0; 
     gbc_panel_2.gridy = 2; 
     panel.add(panel_2, gbc_panel_2); 
     panel_2.setLayout(new GridLayout(0, 1, 0, 0)); 

     JLabel lblIfelse = new JLabel("If/Else"); 
     panel_2.add(lblIfelse); 
     lblIfelse.setBorder(new LineBorder(Color.LIGHT_GRAY)); 
     lblIfelse.setFont(new Font("SansSerif", Font.PLAIN, 23)); 
     lblIfelse.setForeground(Color.WHITE); 

     JButton btnIfCondrtion = new JButton("If Condrtion"); 
     btnIfCondrtion.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       nextPlace = new BasicIfCondition(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     btnIfCondrtion.setSelected(true); 
     panel_2.add(btnIfCondrtion); 

     JButton btnCompareCondition = new JButton("Compare Condition"); 
     btnCompareCondition.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 
       nextPlace = new CompairCondition(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     panel_2.add(btnCompareCondition); 

     Button btnFunctionCondition = new Button((String) null); 
     btnFunctionCondition.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      } 
     }); 
     btnFunctionCondition.setText("Function Condition"); 
     panel_2.add(btnFunctionCondition); 

     JButton btnCombinedCondition = new JButton("Combined Condition"); 
     btnCombinedCondition.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 
       nextPlace = new CombinorCondition(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     panel_2.add(btnCombinedCondition); 

     JPanel panel_3 = new JPanel(); 
     panel_3.setBorder(new LineBorder(Color.WHITE, 1, true)); 
     panel_3.setBackground(Color.DARK_GRAY); 
     GridBagConstraints gbc_panel_3 = new GridBagConstraints(); 
     gbc_panel_3.fill = GridBagConstraints.HORIZONTAL; 
     gbc_panel_3.insets = new Insets(0, 0, 5, 0); 
     gbc_panel_3.anchor = GridBagConstraints.NORTH; 
     gbc_panel_3.gridx = 0; 
     gbc_panel_3.gridy = 3; 
     panel.add(panel_3, gbc_panel_3); 
     panel_3.setLayout(new GridLayout(0, 1, 0, 0)); 

     JLabel lblGlobal = new JLabel("Global"); 
     panel_3.add(lblGlobal); 
     lblGlobal.setBorder(new LineBorder(Color.WHITE)); 
     lblGlobal.setFont(new Font("SansSerif", Font.PLAIN, 23)); 
     lblGlobal.setForeground(Color.WHITE); 

     JButton btnFunction = new JButton("Function"); 
     btnFunction.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       nextPlace = new JavaScriptFunktion(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     panel_3.add(btnFunction); 

     JButton btnEvent = new JButton("Event"); 
     btnEvent.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       nextPlace = new EventItem(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     panel_3.add(btnEvent); 

     JButton btnValue = new JButton("Value"); 
     btnValue.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      } 
     }); 
     panel_3.add(btnValue); 

     JButton btnVariable = new JButton("Variable"); 
     btnVariable.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       nextPlace = new JavaScriptVariable(); 
       placeFrame.getContentPane().removeAll(); 
       DragItemComp c = nextPlace.getComponent(); 
       c.setLocation(0, 0); 
       c.setSize(c.getPreferredSize()); 
       placeFrame.getContentPane().add(c); 
       placeFrame.setSize(0,0); 
      } 
     }); 
     panel_3.add(btnVariable); 

     JPanel panel_4 = new JPanel(); 
     panel_4.setBorder(new LineBorder(Color.WHITE, 1, true)); 
     panel_4.setBackground(Color.DARK_GRAY); 
     GridBagConstraints gbc_panel_4 = new GridBagConstraints(); 
     gbc_panel_4.fill = GridBagConstraints.HORIZONTAL; 
     gbc_panel_4.insets = new Insets(0, 0, 5, 0); 
     gbc_panel_4.anchor = GridBagConstraints.NORTH; 
     gbc_panel_4.gridx = 0; 
     gbc_panel_4.gridy = 4; 
     panel.add(panel_4, gbc_panel_4); 
     panel_4.setLayout(new GridLayout(0, 1, 0, 0)); 

     JLabel lblActions = new JLabel("Actions"); 
     panel_4.add(lblActions); 
     lblActions.setForeground(Color.WHITE); 
     lblActions.setFont(new Font("SansSerif", Font.PLAIN, 23)); 
     lblActions.setBorder(new LineBorder(Color.WHITE)); 

     JButton btnChangeVariable = new JButton("Change Variable"); 
     btnChangeVariable.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      } 
     }); 
     panel_4.add(btnChangeVariable); 

     JButton btnCallFunction = new JButton("Call Function"); 
     panel_4.add(btnCallFunction); 

     JPanel panel_5 = new JPanel(); 
     panel_5.setBorder(new LineBorder(Color.WHITE, 1, true)); 
     panel_5.setBackground(Color.DARK_GRAY); 
     GridBagConstraints gbc_panel_5 = new GridBagConstraints(); 
     gbc_panel_5.anchor = GridBagConstraints.NORTH; 
     gbc_panel_5.fill = GridBagConstraints.HORIZONTAL; 
     gbc_panel_5.gridx = 0; 
     gbc_panel_5.gridy = 5; 
     panel.add(panel_5, gbc_panel_5); 
     panel_5.setLayout(new GridLayout(0, 1, 0, 0)); 

     JLabel label = new JLabel("Loops"); 
     panel_5.add(label); 
     label.setForeground(Color.WHITE); 
     label.setFont(new Font("SansSerif", Font.PLAIN, 23)); 
     label.setBorder(new LineBorder(Color.WHITE)); 

     JButton btnFor = new JButton("For"); 
     panel_5.add(btnFor); 

     JButton btnForEach = new JButton("For Each"); 
     panel_5.add(btnForEach); 

     Button btnWhile = new Button((String) null); 
     btnWhile.setText("while"); 
     panel_5.add(btnWhile); 

     JButton btnTimeLoop = new JButton("Time Loop"); 
     panel_5.add(btnTimeLoop); 

     JPanel desingerPanel = new JPanel(); 
     splitPane.setRightComponent(desingerPanel); 

     JPanel tryIt = new JPanel(); 
     tryIt.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if(nextPlace == null) 
        return; 
       DragItemComp comp = nextPlace.getComponent(); 
       nextPlace = null; 
       comp.setLocation(e.getPoint()); 
       comp.setSize(comp.neededSize); 
       tryIt.add(comp); 
       tryIt.validate(); 
       tryIt.repaint(); 
       for(Component c : tryIt.getComponents()){ 
        System.out.println(c); 
       } 
      } 
     }); 

     GroupLayout gl_desingerPanel = new GroupLayout(desingerPanel); 
     gl_desingerPanel.setHorizontalGroup(
       gl_desingerPanel.createParallelGroup(Alignment.LEADING) 
       .addGroup(Alignment.TRAILING, gl_desingerPanel.createSequentialGroup() 
         .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
         .addComponent(tryIt, GroupLayout.PREFERRED_SIZE, 961, GroupLayout.PREFERRED_SIZE) 
         .addContainerGap()) 
       ); 
     gl_desingerPanel.setVerticalGroup(
       gl_desingerPanel.createParallelGroup(Alignment.LEADING) 
       .addGroup(gl_desingerPanel.createSequentialGroup() 
         .addComponent(tryIt, GroupLayout.PREFERRED_SIZE, 776, GroupLayout.PREFERRED_SIZE) 
         .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
       ); 
     tryIt.setLayout(null); 
     desingerPanel.setLayout(gl_desingerPanel); 
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       //Will change this soon 
       while(isVisible()){ 
        try { 
         Thread.sleep(10000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        if(nextPlace == null || !tryIt.isVisible()){ 
         if(placeFrame.isVisible()) 
          placeFrame.setVisible(false); 
         continue; 
        } 
        Point p = MouseInfo.getPointerInfo().getLocation(); 
        if(!new Rectangle(tryIt.getLocationOnScreen(),tryIt.getSize()).contains(p)) 
        { 
         if(placeFrame.isVisible()) 
          placeFrame.setVisible(false); 
         continue; 
        } 
        else{ 
         if(!placeFrame.isVisible()) 
          placeFrame.setVisible(true); 
        } 
        placeFrame.setLocation(p); 
        if(placeFrame.getHeight() < 20) 
         placeFrame.setSize(nextPlace.getComponent().neededSize); 
       } 
      } 
     }).start(); 
    } 
} 

为了缩短我删除了的getter/setter和进口。

一个有趣的事实是CPU使用率随着我设置nextPlace(按下一个按钮)而提高,并且对于每个DragItem,程序需要15%-25%的CPU。

那么为什么它需要这么多的CPU,我该如何改变它?

另一个有趣的事实是,CPU使用率并不依赖于线程的休眠时间。我尝试了100000,1000,10,1毫秒。它没有改变任何东西!

I uploaded您需要执行的所有类。 - > DragTester.java是主类。
您是否需要更改“包com.niton。**”的decalration。
我更新了需要更少CPU的代码。

+0

用探查器来查看它,比如YourKit – Rogue

+3

请在发布代码之前先在[mcve]中找出问题。 –

+0

我说我很抱歉张贴了那么多的代码。 – Niton

回答

4

简单的答案是:不要做更多的工作,而不是从你的绘画方法中绝对必须做的。

匆匆一瞥,您将创建一个新的Font并在每次调用paint时调用setPreferredSize。

创建您的字体一次,缓存并从您的绘画方法引用它。

此外,您的绘画方法之外调用setPreferredSize。

+0

Thx求助!!!! 现在它需要0.8至3% – Niton