【发布时间】:2021-09-22 10:55:45
【问题描述】:
我见过很多类似的问题但是我无法理解为什么重绘不能正常工作
在我的程序中,在退出框架之前,我调用了 repaint(),使用 Thread.sleep 延迟退出,然后消息“鼠标退出”也不会显示。
您能否解释一下为什么会发生这种情况或提供相同的链接
public void mouseExited(MouseEvent me)
{
msg="Mouse Exited";
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.exit(0);
}
完整的程序
/**Write a program to create a frame using AWT. Implement mouseClicked( ),
mouseEntered( ) and mouseExited( ) events. Frame should become visible when
mouse enters it. */
import java.awt.*;
import java.awt.event.*;
class Question8 extends Frame{
static Dimension original;
String msg;
Question8(String s)
{
msg=s;
addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent me)
{
msg="Mouse Clicked";
setSize(original);
repaint();
}
public void mouseEntered(MouseEvent me)
{
msg="Mouse Entered";
setSize(original.height*3,original.width*3);
repaint();
}
public void mouseExited(MouseEvent me)
{
msg="Mouse Exited";
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.exit(0);
}
});
addWindowListener(new WindowAdapter()
{
public void windowClosing(Window ev)
{
System.exit(0);
}
});
}
public void paint(Graphics g)
{
g.drawString(msg, 50, 50);
}
public static void main(String agrs[])
{
Question8 obj=new Question8("Hello");
original=new Dimension(300,300);
obj.setSize(original);
obj.setTitle("Question 8");
obj.setVisible(true);
}
}
【问题讨论】:
-
在您的
mouseExited()方法中,您通过repaint()添加重绘请求。这将被考虑,但是有一个问题。您正在阻止负责重新绘制的事件调度线程 (EDT)。 EDT 进入您的mouseExited()方法,被告知在不久的将来重新绘制,然后被您的Thread.sleep(1000)阻止一秒钟(此时它不能做任何事情,因为它处于休眠状态),然后您退出您的应用程序通过System.exit(0). -
从
mouseExited()中删除Thread.sleep()和System.exit()后,您至少应该能够看到一些东西。但是,您应该考虑上一个问题 stackoverflow.com/questions/68356177/… 中的 cmets。 -
为什么要使用 AWT?请参阅this answer,了解放弃 AWT 组件以支持 Swing 的许多充分理由。请注意,Swing 还提供了一个非常适合此用途的
Timer。