`

SwingUtilities.convertPoint 方法的作用

阅读更多
SwingUtilities类是Swing组件内部使用的实用工具,它提供了许多的涉及计算、转换、访问控制、布局等方面的方法。这里我们只讨论它的一个方法public static Point convertPoint(Component source,Point aPoint,Component destination) ;要想理解这个方法,利用图形的方式是最好不过了。如下图:

我们假设最大的容器Container为destination,显示图像的JLabel为source,我们给source增加鼠标监听事件,那么aPoint是指鼠标在source的位置。当我们点击图片上箭头指的位置,aPoint的x值和y值都为0,Pont destPoint = SwingUtilities.convertPoint(Component source,Point aPoint,Component destination) ;destPoint的x值和y值分别是:39 和 86。

我们再用程序来解释这个方法。我们给Component source增加鼠标监听方法,当有鼠标点击source的左上角(上图箭头所指位置)时,触发public void mousePressed(MouseEvent event)方法,我们通过event拿到aPoint,然后我们就可以拿到aPoint的x(event.getPoint().x)和y(event.getPoint().y)值,根据上图他们分别是0,0;而destPoint的值,则是39,86
public void mousePressed(MouseEvent event) {
			// 得到当前坐标点
			destPoint = SwingUtilities.convertPoint(dragPicLabel, event.getPoint(),
					dragPicLabel.getParent());
			// 点击source的左上角(图片上箭头指向),输出 0:0
			System.out.println(event.getPoint().x + " : " + event.getPoint().y);
			// 点击source的左上角(图片上箭头指向),输出 39 : 86
			System.out.println(destPoint.x + " : " + destPoint.y);
		}

现在明白了吧,SwingUtilities.convertPoint(Component source,Point aPoint,Component destination) 的目的就是将坐标系的原点从source转移到destination。根据原来的鼠标位置aPoint,获得坐标转以后的鼠标位置destPoint。这个方法在获得鼠标移动距离,画坐标系,划线时会经常用到。

文章地址:http://javapub.iteye.com/blog/739146
2
1
分享到:
评论
1 楼 willse 2012-03-16  
呵呵,不错!挺有意思的哦。

相关推荐

    Swing线程之SwingUtilities.invoke

    `SwingUtilities.invokeLater`是Swing提供的一种调度方法,用于将任务放入EDT队列,从而在合适的时间安全地更新UI。 首先,理解线程安全和并发性是至关重要的。在多线程环境中,多个线程同时访问共享资源可能导致...

    Swing 线程之SwingUtilities invokeLater docx

    SwingUtilities.invokeLater(new Runnable() { public void run() { progressBar.setValue(count); text.setText(STR + String.valueOf(count) + "%"); } }); ``` 使用 invokeLater 方法可以确保更新进度条和...

    Java开发中的线程安全选择与Swing

    为了确保Swing组件的操作是在EDT中执行,Swing提供了`SwingUtilities.invokeLater(Runnable)`和`SwingUtilities.invokeAndWait(Runnable)`两个方法来帮助开发者解决线程安全问题。 - **SwingUtilities.invokeLater...

    code3.txt dfgd

    SwingUtilities.invokeLater方法用于确保Swing组件的创建和操作在事件分发线程(EDT)上执行,这是因为Swing是单线程的,所有的用户界面更新都需要在EDT上进行以避免线程安全问题。 ### JavaFX的SwingNode组件 ...

    简单的排球比赛计分系统,使用Java Swing实现

    程序创建一个窗口,包含输入分数的文本框、计分按钮、查询按钮、显示比分的文本区域和退出按钮。用户可以通过输入分数进行计分,通过查询按钮...最后,通过SwingUtilities.invokeLater方法确保在正确的线程中运行程序。

    JAVA按钮的移动不重叠

    例如,`SwingUtilities.convertPoint()` 可以帮助在不同组件之间转换坐标。 7. **线程安全**: 在处理GUI的更新时,要确保所有的UI操作都在事件调度线程(Event Dispatch Thread, EDT)中执行。可以使用 `...

    基于Swing的打砖块游戏的Java程序

    程序通过创建Ball、Paddle和Block类来实现游戏的运行逻辑,其中...程序的入口 main 方法通过调用 SwingUtilities.invokeLater 方法来创建一个线程并运行 BreakBlockGame 类,以避免在主线程中创建和显示 Swing 组件。

    你所不知道的五件事情--改进Swing(译) - Jiangshachina

    为了确保UI更新操作能够在正确的线程中执行,Swing提供了一些方法,例如`SwingUtilities.invokeLater()`和`SwingUtilities.invokeAndWait()`。 2. **正确使用方法**: - 使用`SwingUtilities.invokeLater()`来异步...

    Java Swing 24种皮肤合集以及使用方法

    可以使用`SwingUtilities.invokeLater()`来确保这一点: ```java SwingUtilities.invokeLater(() -> { // 设置LookAndFeel的代码放在这里 }); ``` 4. **重新绘制所有组件**: 设置完L&F后,需要更新所有的...

    用java实现的一个俄罗斯方块游戏

    程序首先创建一个TetrisGame对象,并设置游戏窗口的标题、大小、关闭方式和不可调节大小。...最后,创建一个SwingUtilities.invokeLater方法来延迟执行创建TetrisGame对象的代码,确保游戏界面的正确显示。

    JAVA 开发 Swing与多线程

    `SwingUtilities.invokeLater()`方法用于将一个`Runnable`对象添加到队列,以便在EDT中异步执行。这样,即使任务是在其他线程中创建的,也能确保其在更新GUI时不会干扰事件派发。以下是一个简单的例子: ```java ...

    如何用java实现下拉菜单

    然后,在`main`方法中,我们使用`SwingUtilities.invokeLater()`来确保所有GUI操作都在事件调度线程中执行。这很重要,因为Swing组件必须在事件调度线程中创建和修改。 接下来,我们创建了一个`JFrame`实例,用于...

    substance.jar+使用方法

    通常,在`SwingUtilities.invokeLater()` 方法中进行设置,以确保在事件-dispatch线程中操作,防止出现线程安全问题。例如: ```java public static void main(String[] args) { javax.swing.SwingUtilities....

    Java制作多种风格的窗口界面一例.rar

    Java制作多种风格的窗口界面一例,虽然这种界面风格不是太漂亮,但展示了如何实现多风格窗口的变化,如果你的美工不错,可以设计出更漂亮... javax.swing.SwingUtilities.updateComponentTreeUI(this); //更新界面  }

    基于swing的java猜数字游戏代码.zip

    在main()方法中,通过SwingUtilities.invokeLater()方法启动主界面,确保界面在事件分派线程(Event Dispatch Thread)中创建和显示。 注意:此示例只是一个简单的演示,没有包括输入验证和错误处理等完整的功能。...

    java日期时间选择

    SwingUtilities.updateComponentTreeUI(frame); com.qt.datapicker.DateTimePanel dateTimePanel = new com.qt.datapicker.DateTimePanel(true); frame.getContentPane().add(dateTimePanel); //dateTimePanel....

    java皮肤包 加上使用方法

    这段代码的关键点在于`SwingUtilities.invokeLater`方法的使用,它确保了皮肤设置的操作是在事件调度线程中执行的,这对于Swing组件来说是非常重要的,因为它们必须在事件调度线程中初始化和更新。 #### 4. 测试和...

    再论JavaSwing线程.pdf

    解决此问题的常用方法是使用Swing提供的异步机制,如`SwingUtilities.invokeLater()`或`SwingWorker`。这些工具允许开发者将耗时任务放在后台线程中执行,同时保持用户界面的响应性。然而,这些解决方案的正确实施...

    桌面应用程序架构.pdf

    - 应用程序启动时,通过`SwingUtilities.invokeLater()`方法在事件派发线程上调度UI组件的创建和初始化,确保所有Swing组件都在正确的线程上下文中运行。 #### 4. 处理长任务 - 使用`SwingWorker`类或其他多线程...

    图形时钟....

    为确保线程安全,我们需要使用`SwingUtilities.invokeLater()`或`SwingUtilities.invokeAndWait()`方法来调度这些操作。 最后,为了让时钟看起来更美观,我们可以使用Swing的布局管理器(如`FlowLayout`、`...

Global site tag (gtag.js) - Google Analytics