在JPanel中优化数千个JPanel

时间:2017-04-08 20:30:01

标签: java swing jpanel

我在优化向现有面板添加约4,000个新创建的JPanel组件时遇到问题。

问题是,令人惊讶的是,它很慢。完成添加它们需要将近10秒钟,这对我来说非常缓慢。

public static void main(String[] args) {
    JMenuItem mntmGenerateRandom = new JMenuItem("Generate random int");
        mntmGenerateRandom.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random rand = new Random();
                for(int i = 0; i < 4000; i++){
                    intPositions.add(rand.nextInt(4000));
                    System.out.println(i);
                }
                quicksort(0, intPositions.size()-1, intPositions);
                long start = System.currentTimeMillis();
                repaintPanels();
                long stop = System.currentTimeMillis();
                System.out.println("Done in " + (stop-start) + "ms");
            }
        });
}

private void repaintPanels(){
    panelArray.clear();
    ExecutorService service = Executors.newWorkStealingPool();
    service.submit(new Runnable() {
        public void run() {
            for(int i = 0; i < intPositions.size(); i++){
                panelArray.add(i, new JPanel());
                panelArray.get(i).setBounds(intPositions.get(i), 1, 1, panelParent.getHeight()-2);
                panelParent.add(panelArray.get(i), 1);
            }
        }
    });
    panelParent.repaint();
    panelParent.revalidate();
}

这是简化的代码,删除了所有不必要的内容。最慢的部分是我打电话给panelParent.add(panelArray.get(i), 1);

有没有人能帮助我加快速度(如果可能的话)?

2 个答案:

答案 0 :(得分:2)

改为使用 JTable 。它可以使用一个JComponent子(如JPanel)使用CellRenderer和CellEditor绘制所有单元格。

这是一个飞行重量模式,您也可以自己实现:在一个JPanel中绘制所有“面板”。

答案 1 :(得分:2)

如果Joop想要一个解决方案,那么我也是。

正如我在评论中所指出的,JPanel通常用作容器作为包含其他组件的组件,并且您似乎并没有将其用于此目的,而是(至我的眼睛 - 但是我不能100%肯定,直到你为我们澄清你的问题),画出一幅图像。如果是这样,如果您要尝试绘制的是块或链接的更改图像,那么随着您的排序算法(或您在模型中尝试做的任何事情)而变化的图像会发生变化,那么为什么而不是使用单个绘图JPanel,其paintComponent已被覆盖,并且其paintComponent在模型更改时绘制模型的状态。这也是 重量轻于你想要实现的重量。