使对象在渲染中间渲染一半

时间:2017-09-23 03:55:09

标签: java swing paintcomponent repaint jcomponent

我目前正在制作动画来比较两种证券交易所算法。我在paint组件中运行扩展JComponent的算法。 (不是最好的,但我不在乎)我需要在画面组件中间刷新屏幕。我不希望它在屏幕上显示之前必须完全通过。原因是我有一个嵌套while循环的算法,另一个没有。我该怎么做呢?

public void paintComponent(Graphics g) {            
    //calls in the super class and calls the calibrate the graphics method
    super.paintComponent(g);
    Graphics2D g2D = (Graphics2D) g;
    calibrateFrame( getHeight(), getWidth() );

    //Clears the rectangle to avoid overlaying, makes it black
    g2D.clearRect(0, 0, getWidth(), getHeight());
    g2D.setColor(Color.BLACK);
    g2D.fillRect(0, 0, getWidth(), getHeight());

    //Draws the rectangles without the algorithm started
    redraw(g2D, -1);


    /**
     *algorithms
     */
    fastSpans[0] = 1;
    slowSpans[0] = 1;

    //Makes a new stack pushes 0 on the stack
    Stack myStack = new Stack();
    myStack.push(0);

    //If it has not been sorted or paused, continue the algorithm
    if (!(pause) && !(sorted)){

        //The slower algorithm needs to start out at zero (j)
        int j = indexValue-1;

        g2D.setColor(Color.BLUE);

        //Calculates the values for the X and Y coordinates for the 
        //new rectangle, along with the height
        int slowY = calSlowY(j);
        int slowX = calSlowX(j);
        int curHeightSlow = (int) ((stocks[j]/maxStockValue)*maxHeight);

        //Here is the actual algorithm
        int k = 1;
        boolean span_end = false;
        //Nested While Loop
        while (((j-k)>0) && !span_end){
            if (stocks[j-k] <= stocks[j]){
                k = k + 1;
                // Draw the current component
                // **********************
                // DO REFRESH MID PAINT COMPONENT
            }
            else{ span_end = true; }
        }
        slowSpans[j] = k;
        g2D.setColor(Color.WHITE);
        for(int i = 0; i < numberOfStock ; i++){


        }

        if (!(indexValue >= numberOfStock)){
            while (!( myStack.empty()) && (stocks[(int)myStack.peek()]) <= stocks[indexValue]){
                myStack.pop();
            }
            if (myStack.empty()){
                fastSpans[indexValue] = indexValue + 1;

            }
            else {
                fastSpans[indexValue]= indexValue - (int) myStack.peek();
                //System.out.println("Im in the else");
            }
            myStack.push(indexValue);
        }
    }
    drawStrings(g2D);
}

2 个答案:

答案 0 :(得分:0)

  

我在paint组件中运行扩展JComponent的算法。 (不是最好的,但我不在乎)

但是应该关心,因为这会影响您的问题和可能的解决方案。

  

我需要让屏幕刷新一半的paint组件。我不希望它在屏幕上显示之前必须完全通过。原因是我有一个嵌套while循环的算法,另一个没有。我该怎么做呢?

然后不要通过paintComponent运行算法。而是使用SwingWorker<Void, Image>,更新BufferedImage并通过worker的发布/处理方法对将该图像传递给GUI,同时调用repaint()。有关如何使用SwingWorker的更多信息,请查看:Lesson: Concurrency in Swing

答案 1 :(得分:-2)

不要理解中途的意思。

如果它意味着组件的一半,那么简单的方法是使用两个JComponent。

如果u表示在同一组件中,则更新了一行,但未更新另一行。

我理解重绘是在pack(),updateUI()或invalidate()引起的时候调用的。 所以在我看来,repaint()应该只关心绘制这些行/ 2D,而在另一个线程中执行这些循环/生成这些数据。数据收集完成后,只需调用updateUI()/ paintImmediately。

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        repaint();
    }
});