问题标签 [repaintmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
591 浏览

java - 摆动线程违规

在 Swing 中调试一个奇怪的行为时,我发现了这个工具: Alex Ruiz 编辑的CheckThreadViolationRepaintManager版本。(在回答我的问题之前,您必须了解该课程的作用,谢谢)

我在我的代码中发现了线程冲突,但我不明白为什么,因为我到处都使用 SwingUtilities.invokeAndWait()。

这是导致 threadViolation 的代码。只有最后一行导致错误:

结果:

我真的不明白为什么this.setVisible(true); this.printedComponent.setVisible(true);时导致线程冲突(这是一个 JComponent );不。

谢谢,

0 投票
3 回答
1450 浏览

java - PaintComponent Java 慢

我一直在我的 Mac 上开发 JAVA Applications 。逻辑如下:

  1. 服务器向客户端应用程序发送一些命令以绘制基本形状
  2. 客户端应用程序将基本形状绘制到 Jpanel 中

每次 Shape 到达时,程序都会调用 repaint()

一切都很顺利(实时),所以我决定在 Windows 计算机上测试相同的应用程序。结果是一个滞后的应用程序。这些是我得出的结论。

  • RepaintManager 正在累积 repaint() 调用。我看到了形状如何到达目的地,但在某些情况下,超过 5 个重绘调用被累积为一个,这使得应用程序非常滞后/不是实时的。

我试过而不是每次形状到达时都调用重绘,每隔几毫秒用一个计时器来做,结果是一样的。代码 :

此外,我还测试了一些允许您使用鼠标绘画的随机代码,与我使用paintComponent 的逻辑相同。在这种情况下,它工作顺利,没有滞后感......示例:http: //javagraphics.blogspot.com.es/2010/06/shapes-implementing-freehand-pencil.html

我不明白为什么我的 Windows 计算机(同一个 Jar)上的paintComponent 这么慢。什么可能会影响我的程序的性能?

我已经阅读了有关油漆组件的所有答案,但其中任何一个都解决了这个问题。

关于如何解决问题并实际存档实时的任何建议?

先感谢您

更新视频:

Mac 视频:https ://youtu.be/OhNXdGXoQpk实时处理重负载没问题

Windows 视频https://youtu.be/yol2miHudZc明显滞后

我为低质量道歉

更新缓冲图像:

引入 BufferedImage 后,结果仍然是一个缓慢的绘画应用程序。它产生了另一个问题,因为其中一个命令是删除所有形状,它增加了一些复杂性,因为我必须做一个:

硬件/操作系统/Java版本

视窗

  • 处理器 i5-4300u 2.5ghz
  • 内存 12GB
  • Java 版本 1.7.0_71

苹果电脑

  • 处理器 i7 2.9ghz
  • 内存 8GB
  • Java 版本 1.7.0_67

Java VisualVM

VisualVM 直播视频:https ://youtu.be/cRNX4b3rlZk

我没有看到任何奇怪的东西可以解释为什么会出现滞后,但我远不是专家(再次为低质量感到抱歉)

感谢您的所有回复

0 投票
0 回答
12 浏览

java - Java paintDirtyRegions 错误(NullPointerException)

我正在尝试将 CardLayout 中的卡片从我的游戏 JPanel 切换到我的 gameOver JPanel。游戏没有切换屏幕,而是崩溃了。感谢您提前提出的任何建议。

我的游戏代码:

我的窗口代码(错误似乎是由将 CardLayout 切换到 gameOver JPanel 引起的):

我得到的错误如下:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Game.paint(Game.java:59) at javax.swing.JComponent._paintImmediately(JComponent.java:5106) at javax.swing.JComponent.paintImmediately(JComponent.java:4890) at javax.swing.RepaintManager$3.run(RepaintManager.java:814) at javax.swing.RepaintManager$3.run(RepaintManager.java:802) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:802) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:745) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:725) at javax.swing.RepaintManager.access$1000(RepaintManager.java:46) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715) at java.awt.EventQueue.access$400(EventQueue.java:82) at java.awt.EventQueue$2.run(EventQueue.java:676) at java.awt.EventQueue$2.run(EventQueue.java:674) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86) at java.awt.EventQueue.dispatchEvent(EventQueue.java:685) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

0 投票
1 回答
17 浏览

java - 创建 Graphics 实例时

我知道什么时候应该创建一个类paint的实例。GraphicsGraphics对象(实际上Graphics2D是对象)正在通过paint()方法,应在屏幕上打印或更新的所有详细信息都存储在该对象中。

据我所知,这个过程是由RepaintManager用户调用repaint()方法或需要重绘到UI. 因此,Graphics必须创建一个实例来存储有关绘画的信息。

由于这个过程是由处理的RepaintManager,我以为Graphics实例也是在里面初始化的RepaintManagerRepaintManager但是我最近找到了源代码。并且找不到Graphics创建新实例的位置。

那么,它真的是在内部RepaintMananger还是在其他任何地方创建的......?
谢谢..

0 投票
1 回答
983 浏览

java - java.lang.IndexOutOfBoundsException:Jidesoft DocumentPane 中的索引:1,大小:1

编辑3:这个不重复一般的“我的代码中有indexoutofboundsexception”问题,因为正如答案中明确指出的那样,这是一个广泛使用的第三方库中的一个错误jide-common,经开发人员确认,下面有一个链接。此错误最近已修复(在发布此问题后),并且该库的许多旧版本仍然受到影响。因此,此信息可能对偶然发现 jide-common 相同问题的其他开发人员有用。

我在 Java 中遇到了 GUI 编程的问题。我不确定问题的具体来源(仍然无法弄清楚) - 这可能是我在某处的错误,jide 组件中的一些错误代码,甚至是 awt/swing 焦点或事件处理有问题。

以下代码取决于

  • com.jidesoft:jide-grids:3.5.1
  • com.jidesoft:jide-components:3.5.1
  • com.jidesoft:jide-common:3.5.1

我在 Stackoverflow 上找到了这个提示,但经过一些调试后,对我来说似乎对 CellEditor 和其他组件的每次修改都是在 EDT 中完成的。

要重现该错误,您应该运行此示例并打开包含 CellEditor 的选项卡(它必须是最后一行,否则不会发生索引溢出),然后在其中输入一些“不正确”的值并且不从编辑器中移除焦点,单击关闭前一个选项卡上的“x”按钮。之后发生以下事件链:1) 选项卡关闭/删除,2) CellEditor 验证程序显示模式对话框,该对话框反过来触发选项卡窗格的重绘 3) 由于缺少(关闭)选项卡,抛出 ArrayIndexOutOfBounds 异常。

例外:

有一个“扩展”版本的代码,添加了一些调试信息。我仍然无法弄清楚问题的根源,更不用说修复了。提前致谢。

编辑:好的,我现在发现的一件事是,根据文档显示从 verify() 方法中的对话框是错误的

verify 方法的存在只是为了确定输入是否有效,它永远不会打开对话框或导致任何其他副作用。shouldYieldFocus 方法调用验证,如果值无效,则将其设置为最小值或最大值。允许 shouldYieldFocus 方法产生副作用...

因此,我将所有非实际验证代码移至 shouldYieldFocus()。这并没有解决问题,但使用 SwingUtilities.invokeLater() 进一步延迟 dialog.show() 似乎工作正常,没有陷阱......但是。

Edit2: 带有捕获视频的 gif

0 投票
0 回答
321 浏览

java - Java repaint() 不调用小程序中的paint()

需要明确的是,我已经研究了五个多小时,我阅读了所有相关问题和 20 多个谷歌搜索,但没有一个对我有用,也没有一个具体描述我的案例。

首先这是我的代码:

我的问题是重绘方法没有调用绘画方法。更具体地说,如果我从另一个线程调用重绘,或者如果我将绘制方法添加到子类并调用重绘但它在我的代码中不起作用,我会直接从小程序主线程调用它. 请HEEEEELP,我累了

0 投票
3 回答
464 浏览

swing - 在 Clojure 中使用 Swing - 编译器异常:无法初始化 RepaintManager

我刚刚开始尝试使用 Swing 使用 Clojure 创建 UI。但是我在尝试加载它时遇到了 CompilerException。我一直在关注本教程' https://stuartsierra.com/2010/01/02/swing-into-actions-with-clojure '。

我正在使用带有 Cursive 的 IntelliJ IDEA 社区,使用 Leiningen 和 Clojure 1.8,并且我使用的是 Linux Mint 19.1(如果这很重要的话)。

我的代码:

当通过 nREPL 运行时,我得到:

编辑:另外,当我重新启动 REPL 并第一次加载文件时,我收到此错误:

不知何故,当我单独在 repl 中搞乱时,我已经让这个示例工作了,然后可以毫无问题地从文件加载。除了使用其他导入功能外,不知道我做了什么不同的事情:

但我不能再复制它并让它发挥作用。

任何帮助我指出正确的方向来解决这个问题将不胜感激。

0 投票
2 回答
103 浏览

java - 特定的 RepaintManager 可以用于特定的 JPanel 吗?

我知道 Java RepaintManager 将合并对 repaint() 的调用,这对于 99% 的渲染来说都很好。我有一个 JPanel,我想在计时器(100 毫秒)上更新图像,以提供像视频一样的平滑渲染。在实践中,除非鼠标被移动,否则 RepaintManager 似乎会窃取/忽略所有其他 repaint() 。我想知道我必须有哪些选项来解决这个问题。我还查看了paintImmediately(),但它导致与repaint() 相同的行为,因此不是很有用。提前感谢您的有用想法!

  1. 是否可以为特定的 JPanel 创建和使用自定义 RepaintManager,并为其他所有内容使用默认值?
  2. 有没有办法让默认的 RepaintManger 确定某个面板是“脏的”,这样它会被重新绘制而不是被忽略?

下面是一些用于说明实现的代码,您会注意到(至少在我的 Linux 测试中),这些数字几乎会跳过所有其他序列。

0 投票
0 回答
103 浏览

java - SwingUtilities3.setDelegateRepaintManager 的 Java 9 替代品

在尝试移植 swing 代码以符合 Java 模块系统时,我在尝试替换SwingUtilities3.setDelegateRepaintManager.

我有一个组件,当它的任何孩子请求重绘时,我需要转换该区域(特别是这试图org.pbjar.jxlayer.plaf.ext.TransformUI为任何知道这一点的人移植代码)。目前,这是通过设置组件的委托重绘管理器并拦截对addDirtyRegion.

现在使用 Java 9,这样做的方法不再作为公共 api 可用。原始代码提供了一种替代方法,该方法最初用于不可用的旧版 Java SwingUtilities3.setDelegateRepaintManager,它只是用RepaintManager委托实现替换了全局。如果组件包含在需要转换的实际组件中,它会检查每个调用。然而,此解决方案会丢弃所有内部数据,RepaintManager并在调整框架大小时导致严重闪烁。

这是当前使用的代码的精简版:

以及导致闪烁的替代方法(DelegateRepaintManager 只需采用原始方法RepaintManager并将所有调用转发给它):

我知道一种选择是简单地添加--add-exports java.desktop/com.sun.java.swing=<module name>到启动参数中,但由于这是一个库,迫使每个人都使用它,所以我认为这不是最好的选择。

更新: 这是一个演示上述两种方法的示例。它由一个面板组成,该面板在JLayer. 切换复选框以不同的颜色绘制组件的左侧(视觉顶部)或右侧(视觉底部)部分。可以通过在 中设置静态变量来更改不同的方法TransformLayerUI。可以观察到以下行为:

  • SolutionApproach.FLICKERING:单击复选框的行为与预期相同。调整窗口大小会导致闪烁(对于这样一个小例子,它不是很基础,但对于较大的应用程序,它会变得更糟) 闪烁的解决方案
  • SolutionApproach.ILLEGAL: 相同,SolutionApproach.FLICKERING但没有闪烁。 非法解决方案
  • SolutionApproach.NONE:单击复选框仅重新绘制应更改区域的四分之一。这是需要解决的问题。如果TestPanel(或任何可能的孩子)请求重绘,则JLayer应该重绘正确的区域。 无解

更新 2:FallbackTransformRepaintMangerextendRepaintManager而不是DelegateRepaintManager. 但是,这会使使用该组件成为破坏性操作,因为RepaintManager之前的任何其他自定义设置都将被覆盖。