2012-10-08 68 views
1

我對設置邊框的「速度」有問題。我有一個顯示多個JTextPane(約450,需要什麼),這是經常更新(取決於用戶輸入)。 這裏是設置邊框功能:java swing setBorder速度問題

private void setBorder(int top, int left, int bottom, int right, Color color) 
    { 
     Args.checkForNull(color); 
     this.setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, color)); 
    } 

你可以給我一些的竅門,如何提高邊境改變的速度? 我的意思是這部分:

this.setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, color)); 

類似:

tmp = this.getStyledDocument(); 
     this.setDocument(blank); 
     if(onOff){ 
      tmp.setParagraphAttributes(0, tmp.getLength(), underlinedAttr, false); 
     } 
     else{ 
      tmp.setParagraphAttributes(0, tmp.getLength(), notUnderlinedAttr, false); 
     } 

     this.setDocument(tmp); 

的感謝!

+2

通常情況下更新文本字段(和邊界)是什麼意思?通常只需爲每個GUI組件(通常在構建時)設置邊界就足夠了。 –

+1

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 ..你如何設法將450個文本窗格填充到一個GUI中?聽起來很「擁擠」。 –

+0

這意味着我必須經常改變邊界。不同的東西顯示在這個區域,它需要改變邊界以獲得不同的外觀。改變取決於用戶輸入。所以它可以經常發生XD – immerhart

回答

3

這對我來說運行速度可以接受,所以你的問題不太可能在setBorder()中。 再次更好地衡量,可能的問題是您是在單獨的事件中更新邊界還是具有非常複雜的佈局。 這可能是你有一個壞的視頻卡(驅動程序),你可以嘗試看看運行-Dsun.java2d.d3d=false運行更好。

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.util.Random; 
import javax.swing.*; 

public class TestBorderSpeed { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       int amount = 22; 

       final JPanel panel = new JPanel(new GridLayout(amount, amount)); 
       for (int row = 0; row < amount; row++) { 
        for (int column = 0; column < amount; column++) { 
         JTextPane pane = new JTextPane(); 
         pane.setText("Row " + row + "; Column " + column); 
         panel.add(pane); 
        } 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(panel); 
       frame.getContentPane().add(new JButton(
        new AbstractAction("Change borders") { 

        private final Random random = new Random(); 
        private final Color[] colors = 
         { Color.RED, Color.GREEN, Color.BLUE }; 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         for (Component component : panel.getComponents()) { 
          ((JComponent) component).setBorder(
           BorderFactory.createMatteBorder(
            random.nextInt(3) + 1, random.nextInt(3) + 1, 
            random.nextInt(3) + 1, random.nextInt(3) + 1, 
            colors[random.nextInt(colors.length)])); 
         } 
        } 
       }), BorderLayout.PAGE_END); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

大聲笑。做得很好。但是我並沒有提高性能:(它速度很快,大約在0.6秒左右,但是如果用戶執行的操作會改變邊界,那麼也會執行更多的操作,所以總體時間大約爲一秒在我的應用程序中,所有其他的東西都是非常優化的,最後一件事是這個邊界的東西,我不相信我的圖片卡是可能的,因爲我在另一臺電腦上測試過它,性能甚至這就是爲什麼我嘗試優化這些東西的原因,因爲在Linux上執行它需要永遠的花費 – immerhart

+2

在我的電腦上它只需要不到50ms的時間,你可以從VisualVM CPU採樣器或分析器顯示一個快照嗎? –

+0

我得到了一封電子郵件,該項目取消了,但謝謝。 – immerhart