`

关于Component如何触发绘制

阅读更多

是在EventDispatchThread类中:

public void run() {
	try {
	    pumpEvents(new Conditional() {
		public boolean evaluate() {
		    return true;
		}
	    });	    
	} finally {
	    /*
	     * This synchronized block is to secure that the event dispatch 
	     * thread won't die in the middle of posting a new event to the
	     * associated event queue. It is important because we notify
	     * that the event dispatch thread is busy after posting a new event
	     * to its queue, so the EventQueue.dispatchThread reference must
	     * be valid at that point.
	     */
	    synchronized (theQueue) {
                if (theQueue.getDispatchThread() == this) {
                    theQueue.detachDispatchThread();
                }
                /*
                 * Event dispatch thread dies in case of an uncaught exception. 
                 * A new event dispatch thread for this queue will be started
                 * only if a new event is posted to it. In case if no more
                 * events are posted after this thread died all events that 
                 * currently are in the queue will never be dispatched.
                 */
                /*
                 * Fix for 4648733. Check both the associated java event
                 * queue and the PostEventQueue.
                 */
                if (theQueue.peekEvent() != null || 
                    !SunToolkit.isPostEventQueueEmpty()) { 
                    theQueue.initDispatchThread();
                }
		AWTAutoShutdown.getInstance().notifyThreadFree(this);
	    }
	}
    }

 

假设给这样一个测试类:

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


class HelloWorldPanel extends JPanel {
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawString("Not a hello,World program", X, Y);
	}

	public static final int X = 75;
	public static final int Y = 100;
}

class HelloWorldFrame extends JFrame {
	public HelloWorldFrame() {
		setTitle("HelloWorld");
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		HelloWorldPanel panel = new HelloWorldPanel();
		getContentPane().add(panel);
	}

	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 300;
}

public class TestHelloWorld {
	public static void main(String args[]) {
		HelloWorldFrame frame = new HelloWorldFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
分享到:
评论

相关推荐

    GDI+绘制运行的时钟源代码

    InitializeComponent(); this.DoubleBuffered = true; } private void ClockForm_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; // 绘制时钟盘面... // 计算并绘制指针... } ...

    MX Component Version 4编程手册+操作手册

    3. **事件处理**:MX Component支持事件驱动的编程模式,手册会详细解释如何注册事件监听器、触发和处理事件,以便在应用中实现响应式交互。 4. **数据绑定**:手册将介绍如何通过数据绑定将组件的属性与应用的数据...

    Java中Component类.pdf

    - `repaint()`方法请求组件重新绘制,通常在组件需要更新时调用,实际上会触发`update`方法。 - `update(Graphics g)`首先清除组件为背景颜色,然后调用`paint`方法并传递`g`参数,对于创建动态效果和动画非常有用...

    c# WPF实现计算绘制凸包

    添加一个Canvas用于绘制点和凸包,一个Button用于触发凸包计算,以及可能的Label或TextBlock用于显示相关信息。 XAML代码示例: ```xml xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...

    Delphi_Component_Writers_Guide_delphi_book_COMPONENT_

    6. **案例研究**:为了更好地理解和应用理论知识,书中可能包含了一些实际组件开发的案例,如创建数据库连接组件、图形绘制组件等,让读者能够在实践中学习。 7. **跨平台开发**:随着FireMonkey框架的引入,Delphi...

    C#实例开发/WinForm/绘制曲线 源码

    InitializeComponent(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); DrawCurve(e.Graphics); } private void DrawCurve(Graphics g) { // 在这里编写绘制曲线的代码 } }...

    C#winform中绘制图形,并实现拉伸效果

    InitializeComponent(); this.rectangle = new Rectangle(50, 50, 100, 100); this.timer = new Timer(); this.timer.Interval = 100; // 每100毫秒更新一次 this.timer.Tick += Timer_Tick; } private void...

    Flex component

    "fire font"标签进一步确认了这个描述是关于创建火焰效果的文字。 在文件列表中,“FireFX”可能是实现这种火焰效果的一个特定库、类或者示例项目。它可能包含了实现火焰效果的代码片段、图形资源,或者是预设的...

    C#图形学绘制正方形

    当窗体需要重绘时(例如,当正方形移动时),此事件会被触发。可以使用Graphics对象的DrawRectangle方法来绘制正方形,需要提供四个参数:左上角的x和y坐标,以及正方形的宽度和高度。 ```csharp private void Form...

    C# 绘制时钟C# 绘制时钟

    // 触发重新绘制 } // 绘制指针 private void DrawHands(Graphics g, int centerX, int centerY, int radius) { // ... } ``` 在DrawHands方法中,计算每个指针的角度和位置,然后使用Graphics的DrawLine方法...

    java swing绘制正弦曲线

    为了绘制正弦曲线,我们需要创建一个`JFrame`实例,并在其内容面板上添加一个自定义的`Component`。 这个自定义的`Component`通常会继承`javax.swing.JComponent`或`java.awt.Component`,然后重写`paintComponent...

    Swing框架定制Component

    本文旨在深入探讨Swing框架中Component的定制方法,特别是GUI的绘制机制以及Swing的线程处理机制。 #### 1. Swing组件的基本概念 在Swing中,所有可视化的组件都是`Component`类的子类或孙类。Swing的核心类`...

    自定义控件 Component Designer

    1. **设计时服务**:Component Designer能够提供各种设计时服务,例如`IComponentChangeService`用于在属性更改时触发通知,`ISelectionService`用于获取当前选中的组件,`ITypeDescriptorContext`提供了上下文信息...

    实验之C#GUI绘制时钟

    Timer的Elapsed事件会在指定间隔触发,我们在这个事件处理器中更新时间,并调用窗体的Invalidate方法,强制重绘窗体,这样时钟就会实时更新了。 代码示例: ```csharp public partial class MyClock : Form { ...

    波形图的绘制Delphi源码实例..rar

    首先,了解Delphi的VCL(Visual Component Library)框架是必要的。VCL提供了大量的控件和组件,如TCanvas和TPaintBox,它们可以用于绘制图形。在这个源码实例中,开发者可能使用了TPaintBox控件来承载波形图的绘制...

    Java绘制图片火焰效果

    在`Java源码软件开发`中,我们通常会将这些代码封装成一个自定义的`JPanel`或`Component`子类,并覆盖`paintComponent`方法进行绘制。这样,我们可以在应用程序中方便地添加和管理这个组件。 总的来说,实现"Java...

    C# 绘制八边形图形窗体

    关于“变形窗体”,这可能是指窗体的形状可以根据用户的交互或其他条件动态改变。在C#中,我们可以利用Region属性来实现这个功能。Region属性决定了窗体的可见区域,我们可以将其设置为我们自定义的形状,比如八边形...

    java源码:Java绘制图片火焰效果.rar

    它提供了各种方法,如`drawRect()`, `drawLine()`, `fillPolygon()`等,用于在Component上绘制图形。在本示例中,开发者可能使用了Graphics对象的`drawImage()`方法来绘制火焰图片。 3. **Image类**: `java.awt....

    基于java简单太阳系绘制

    在每次触发时,我们更新行星的位置,然后调用`repaint()`方法来重新绘制组件。 太阳系中的每个行星可以被抽象为一个类,包含其位置、速度和大小等属性。这些行星类可以继承`java.awt.Shape`接口,这样就能利用Java...

    c#折线绘制新建画布

    接下来,我们要添加一个Paint事件处理程序,这将在窗口加载时触发,用于绘制图形。在窗体类(通常名为Form1.cs)中,找到`Load`事件的处理函数,例如: ```csharp private void Form1_Load(object sender, ...

Global site tag (gtag.js) - Google Analytics