Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java paintComponent的随机调用_Java_Swing_Jpanel_Paint_Paintcomponent - Fatal编程技术网

Java paintComponent的随机调用

Java paintComponent的随机调用,java,swing,jpanel,paint,paintcomponent,Java,Swing,Jpanel,Paint,Paintcomponent,我对Swing有一个问题,我试图理解paintComponent是如何工作的,但我不明白为什么在这种情况下它会被调用两次甚至三次(我似乎是随机调用的) 我正在从事一个不同的项目,我的paintComponent也被调用了好几次,而我只希望它被调用一次,这会阻止我继续前进 提前谢谢 基本上,绘画不在你的控制范围之内,你几乎无能为力 当重新绘制管理器由于某些事件(例如组件被重新调整大小(直接或因为父容器已调整大小)或组件已变得可显示(现在在屏幕上可见或添加到可显示的组件中)而决定需要重新绘制组件时,

我对Swing有一个问题,我试图理解paintComponent是如何工作的,但我不明白为什么在这种情况下它会被调用两次甚至三次(我似乎是随机调用的)

我正在从事一个不同的项目,我的paintComponent也被调用了好几次,而我只希望它被调用一次,这会阻止我继续前进


提前谢谢

基本上,绘画不在你的控制范围之内,你几乎无能为力

当重新绘制管理器由于某些事件(例如组件被重新调整大小(直接或因为父容器已调整大小)或组件已变得可显示(现在在屏幕上可见或添加到可显示的组件中)而决定需要重新绘制组件时,将(间接)调用
paintComponent
和任意数量的系统事件

您需要做的第一件事(除了在进行任何自定义绘制之前调用
super.paintComponent
)是放弃您可能认为对绘制过程有控制权的幻觉


接下来,你应该通读并理解绘画过程是如何工作的。

基本上,绘画不在你的控制范围之内,你可以做的很少

当重新绘制管理器由于某些事件(例如组件被重新调整大小(直接或因为父容器已调整大小)或组件已变得可显示(现在在屏幕上可见或添加到可显示的组件中)而决定需要重新绘制组件时,将(间接)调用
paintComponent
和任意数量的系统事件

您需要做的第一件事(除了在进行任何自定义绘制之前调用
super.paintComponent
)是放弃您可能认为对绘制过程有控制权的幻觉


接下来,你应该通读并理解绘画过程是如何工作的。

基本上,绘画不在你的控制范围之内,你可以做的很少

当重新绘制管理器由于某些事件(例如组件被重新调整大小(直接或因为父容器已调整大小)或组件已变得可显示(现在在屏幕上可见或添加到可显示的组件中)而决定需要重新绘制组件时,将(间接)调用
paintComponent
和任意数量的系统事件

您需要做的第一件事(除了在进行任何自定义绘制之前调用
super.paintComponent
)是放弃您可能认为对绘制过程有控制权的幻觉


接下来,你应该通读并理解绘画过程是如何工作的。

基本上,绘画不在你的控制范围之内,你可以做的很少

当重新绘制管理器由于某些事件(例如组件被重新调整大小(直接或因为父容器已调整大小)或组件已变得可显示(现在在屏幕上可见或添加到可显示的组件中)而决定需要重新绘制组件时,将(间接)调用
paintComponent
和任意数量的系统事件

您需要做的第一件事(除了在进行任何自定义绘制之前调用
super.paintComponent
)是放弃您可能认为对绘制过程有控制权的幻觉



接下来,您应该通读并理解绘制过程是如何工作的。

我只想调用一次
paintComponent
“为什么”的更多信息将有助于为您的问题提供解决方案,因为这不是绘制工作(或可能工作)的方式关于“为什么”我提供了更多的信息,您只需要调用一次
paintComponent
,就可以为您的问题提供解决方案,因为这不是绘画的工作方式(或可能的工作方式),关于“为什么”我提供了更多的信息您只需要调用一次
paintComponent
,就可以为您的问题提供解决方案,因为这不是绘画的工作方式(或可能的工作方式)。我只想了解一下“为什么”您只需要调用一次
paintComponent
,就可以为您的问题提供解决方案,因为这不是绘画的工作方式(或可能的工作方式)。谢谢您快速回答。在我的
paintComponent
中进行任何重新绘制之前,我已经获得了
super.paintComponent
。事实上,我在我的
paintComponent
中有一些处理要做,第一次调用它时,我无法进行处理,因为不是所有的东西都已创建,等等。。。。我不会详细说明,但我必须等待我的JPanel
paintComponent
的第二次调用,否则它将无法工作。因此,我使用了一个标志来确定我是否在第一次通话中,我发现这很难看,但我不知道如何做,否则。无论如何,谢谢你,我要读这篇文章。解决方法可能是在准备好后使用
BuffereImage
绘制所需内容,然后在
paintComponent
方法中绘制
BuffereImage
。这有两个原因。您获得控制并应尽快完成绘制,这将防止应用程序响应出现任何可能的延迟…@user2007740不应有任何级别的处理必须在
paintComponent
中仅执行一次。您应该能够使用init方法和构造函数来解决“一次性”问题…@user2007740您绘制的@user2007740代码可能需要响应,并且应该表示当前已知的状态。如果你需要处理或等待一些东西,那么你不应该在你的绘画方法中这样做。。。或者事实上,在调度线程的情况下,
package paintComponentTest;

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class UI {

public static void main(String[] args) {
    JFrame testFrame = new JFrame();

    TestPanel testPanel = new TestPanel();
    testFrame.setContentPane(testPanel);

    testFrame.setSize(500, 500);
    testFrame.setVisible(true);
}
}

class TestPanel extends JPanel {

@Override
public void paintComponent(Graphics g) {
    System.out.println("Called");
}
}