Java中Component的componentResized事件,但仅在鼠标释放时执行
Posted
技术标签:
【中文标题】Java中Component的componentResized事件,但仅在鼠标释放时执行【英文标题】:componentResized event for Component in Java, but only execute when mouse released 【发布时间】:2011-10-07 23:53:14 【问题描述】:当我的一个组件(一个画布)被调整大小时,我需要进行一些计算。不幸的是,计算可能需要几百毫秒,这会导致调整大小在完成时严重滞后。我想通过仅在调整大小结束时进行计算来解决这个问题(我猜是在释放鼠标按钮时)。我怎样才能做到这一点?到目前为止,我只有以下内容:
MyComponent.addComponentListener(new ComponentAdapter()
@Override
public void componentResized(ComponentEvent e)
super.componentResized(e);
// some calculation
);
谢谢。
PS:我知道对于 JFrame,resized 事件仅在释放鼠标按钮后才会触发,但不幸的是我无法将我的组件放入 JFrame 或让它扩展 JFrame。
【问题讨论】:
你为什么使用AWT
组件?此外,计算是否与正在进行调整大小事件的组件相关?
【参考方案1】:
然后您可以延迟启动 javax.swing.Timer 并在调整大小时仅重新启动 Timer 通过调用 Action 或 AbstractAction 你可以计算任何东西并输出到 GUI 将在 EDT 上
【讨论】:
+1,计时器是要走的路。 invokeLater() 没有帮助。 使用Timer的时候不需要使用invokeLater()。此外,使用 Timer 的好处是每次生成组件大小调整事件时都继续使用 timer.restart()。将 Thread 与 invokeLater() 结合使用是一种不同的解决方案,需要更多编码,因为您需要支持 restart() 逻辑,并且不应在此回复中建议。它只会混淆海报。如果您认为这是一个很好的解决方案,那么您应该发布单独的回复。【参考方案2】:您可以在componentResized()
中设置一个标志并让MouseListener
执行实际工作。
【讨论】:
【参考方案3】:我会像这样做一个 MouseListener:
public class MouseHandler implements MouseListener
public void mousePressed(MouseEvent e)
if(!running)
thread = new Thread(this);
thread.start();
running = true;
public void mouseReleased(MouseEvent e)
running = false;
thread = null
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mouseClicked(MouseEvent e)
public void run()
while(running)
try
//repaint the component or move it or somthing.
Thread.sleep(1000);
// repaint delay
catch(Exception e)e.printStackTrace();
Thread thread;
boolean running;
如果你想改变组件的位置,你可以加入一个 MouseMotionListener
【讨论】:
以上是关于Java中Component的componentResized事件,但仅在鼠标释放时执行的主要内容,如果未能解决你的问题,请参考以下文章
java spring component与autowire区别
Java程序员常用的@Component@Repository@Controller@Serv
在Java的POJO类中添加@Component或@Bean好不好?
java.awt.Component.dispatchEvent() 的目的和行为
Java程序员常用的@Component@Repository@Controller@Service系列案例demo3
Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ① ( AWT 绘图线程 | Component 绘图函数 )