在尝试移植 Swing 代码以与 Java 模块系统兼容时,我在尝试替换SwingUtilities3.setDelegateRepaintManager.
我有一个组件,当它的任何子级请求重绘时,我需要转换该区域(特别是这试图为org.pbjar.jxlayer.plaf.ext.TransformUI知道这一点的任何人移植代码)。目前,这是通过设置组件的委托重绘管理器并拦截对 的调用来完成的addDirtyRegion。
现在使用 Java 9,这样做的方法不再作为公共 api 可用。原始代码提供了一种替代方法,该方法最初用于SwingUtilities3.setDelegateRepaintManager不可用的旧版 Java ,它只是用RepaintManager委托实现替换了全局。如果组件包含在需要转换的实际组件中,它会检查每个调用。然而,该解决方案丢弃了 的所有内部数据RepaintManager并导致在调整框架大小时严重闪烁。
这是当前使用的代码的删节版:
SwingUtilities3.setDelegateRepaintManager(component, new TransformRepaintManger());
...
class TransformRepaintManager extends RepaintManager {
@Override
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
if (c.isShowing()) {
Point point = c.getLocationOnScreen();
SwingUtilities.convertPointFromScreen(point, c);
Rectangle transformPortRegion = transform(new Rectangle(x + point.x, y + point.y, w, h), c);
RepaintManager.currentManager(c)
.addDirtyRegion(c,
transformPortRegion.x, transformPortRegion.y,
transformPortRegion.width, transformPortRegion.height);
} …Run Code Online (Sandbox Code Playgroud) java swing java-platform-module-system swingutilities repaintmanager
关于我的问题(可能),我发现了另一种异常类型,我无法从SwingWorker线程中捕获和打印出来.
如何生成RepaintManager异常?
我读这CheckThreadViolationRepaintManager和该方法通过Alexander Potochkin,但似乎没有解决我的问题.