目前,我有一个包含
JFrame
的JPanel
。 JPanel
是我程序的油漆。绘画意味着我所有的Graphics g
.drawString 东西。
现在,它只会在用户与 JFrame
交互时更新显示,但我希望它在不使用 while 循环(过多的 CPU 使用率)的情况下不断更新(repaint()
)自身。
有人知道我该怎么做吗?
您需要做的是,只要您知道面板上的图像部分发生变化,就通知 swing 组件。正如您所说,通常的方法是调用
repaint()
,如果您知道“无效”的矩形,您也可以指出。
根据导致
JPanel
内容的事件,您需要更改应用程序设计,以便应用程序的表示部分“侦听”下面数据的变化,并在这些变化发生时重新绘制。
还有另一种方法称为
paintImmediately()
,它可能适用于某些情况,但你必须多描述一下你的场景,在哪些情况下你需要不断重绘。
我已经实现了一个功能齐全的互联网中继聊天系统,它涉及绘画以查看您和其他人在说什么
听起来您正试图从服务器“拉取”更新,然后您可以使用 SwingWorker 查询服务器的更新,然后将更新推送到 GUI。您可能希望 SwingWorker 休眠,这样它就不会持续轮询服务器。
阅读 Swing 教程中有关 Worker Threads 和 SwingWorker 的部分以获取更多信息。
也许更好的设计是服务器应该将更新“推送”到客户端,而客户端应该监听更改然后重新绘制自己。也许所有关于套接字部分会帮助你。
编辑:
这是我 5 年多没看过的一些旧代码。 “客户端”是一个简单的文本窗格,它将键入的每个字符发送到“服务器”。服务器然后将每个字符发送到连接到服务器的任何其他客户端。服务器拥有最新文档的想法。当一个客户端发送更改时,所有其他客户端都会收到更改通知。这样所有客户端总是包含相同的数据。您的代码应该更简单,因为您只会向服务器发送完整的消息。要运行代码,请打开一个 dos 窗口并键入:
java 文档服务器 1234
这将启动一个监听端口 1234
的服务器然后打开另一个窗口并输入
java 文档客户端 1234 3
这将创建 3 个连接到服务器的客户端框架。输入任何一个框架都会更新服务器。
您可以在此处获取压缩文件: