java swing setBorder速度问题

时间:2012-10-08 08:52:44

标签: java performance swing border jtextpane

我对设置边框的“速度”有疑问。我有一个显示多个JTextPane(大约450,需要什么),它们经常更新(取决于用户输入)。 这是设置边框功能:

    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);

谢谢!

1 个答案:

答案 0 :(得分: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);
            }
        });
    }
}