Swing覆盖对象的paintComponent

Lan*_*fee 4 java swing paintcomponent

如果我有一个JPanel我无法修改的对象,有没有办法可以在paintComponent不使用注入的情况下修改它的方法?

一种方法我想的是获取JPanelGraphics对象,将它传递给paintComponent(),这个执行操作Graphics的对象,终于画,在我的自定义JPanel.这样做的问题,是我需要能够这样原来的每一次做JPanelpaintComponent()叫.

我不需要替换paintComponent()中的内容,我只需要添加它.

例如:

JFrame frame = null;
for (Frame f : JFrame.getFrames()) {
  if (((JFrame) f).getTitle().equals("Title")) {
    JPanel panel = null;
    // ... Cycle through all components and get the one that's a JPanel

    // I want to use ColorConvertOp to make panel greyscale
  }
}
Run Code Online (Sandbox Code Playgroud)

Dur*_*dal 6

一种方法是使用Decorator Pattern来包装现有的类.然后,您的装饰器可以实现paintComponent以首先委托给原始组件,然后在其上面绘制.对于这种方法,您需要实际控制组件的创建,或者在创建组件层次结构后需要替换它们(使用父容器的getComponents()来查找要更改的组件).

  • @LanguagesNamedAfterCofee您应该只接受答案,如果它是您问题的解决方案而不是一遍又一遍地切换接受的答案.您不必立即接受答案,您可以等待几天来做出决定.有人不太可能在"已解决"的问题上发布另一个答案. (2认同)

bri*_*ium 5

我认为一种可能性是使用a GlassPane并将其准确定位在您的上方JPanel(如果面板更改其位置,可以让它使用侦听器跟随面板).然后你可以简单地在玻璃板上画出你的东西,然后叠加.

当然这不是很优雅......但是我没有看到任何可能在paintComponents没有注入的情况下改变已经存在的实例的行为.(证明我错了,这个世界的Java极客!:P)