我如何自动更新我的JFrame油漆?

时间:2011-09-04 18:15:59

标签: java jframe jpanel paint paintcomponent

目前,我的JFrame包含JPanelJPanel是我程序的绘画。 Paint意味着我所有Graphics g。drawString的东西。 现在,它只在用户与JFrame交互时更新显示,但我希望它不使用while循环(CPU使用率过高)不断更新(repaint())本身。

任何人都知道我该怎么做?

2 个答案:

答案 0 :(得分:0)

当您知道面板上的图像部分发生变化时,您需要做的是通知swing组件。正如你所说的那样,正常的方法是调用repaint(),如果你知道'无效'的矩形,你也可以表示。

根据导致JPanel内容的事件,您需要更改应用程序设计,以便应用程序的表示部分“监听”下面数据的更改并在发生这些更改时重新绘制。

还有另一种名为paintImmediately()的方法可能适用于某些情况,但您必须更多地描述您的情况,以及在哪种情况下您需要不断重新绘制。

答案 1 :(得分:0)

  

我已经实施了一个功能齐全的互联网中继聊天系统,其中包括绘画以查看您和其他人的内容

听起来您正试图从服务器“拉”更新,然后您可以使用SwingWorker查询服务器以获取更新,然后将更新发送到GUI。您可能希望SwingWorker处于休眠状态,因此不会连续轮询服务器。

阅读Worker Threads and SwingWorker上的Swing教程中的部分以获取更多信息。

也许更好的设计是服务器应该“推送”客户端的更新,客户端应该监听更改然后重新绘制自己。也许All About Sockets部分可以帮助您。

编辑:

以下是我在5年多来没有看过的旧代码。 “客户端”是一个简单的文本窗格,它将每个键入的字符发送到“服务器”。然后,服务器将每个字符发送到连接到服务器的任何其他客户端。认为服务器具有最新文档的想法。当一个客户端发送更改时,所有其他客户端都会收到更改通知。这样,所有客户端始终包含相同的数据。您的代码应该更简单,因为您只会向服务器发送完整的消息。要运行代码,请打开dos窗口并键入:

  

java DocumentServer 1234

这将启动侦听端口1234的服务器

然后打开另一个窗口并输入

  

java DocumentClient 1234 3

这将创建3个连接到服务器的客户端框架。键入任一帧都将更新服务器。

您可以在此处获取zip文件:

http://www.camick.com/java/source/echo.zip