我目前正在制作动画来比较两种证券交易所算法。我在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);
}
答案 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();
}
});