2012-10-08 67 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