2014-09-19 57 views
1

这更多的是一个概念性问题,所以很难发布一个小的可用代码示例。但是,我有一个类,这里​​覆盖paintComponent重写paintComponent两次

public abstract class BasePanel extends JPanel { 

    ...  

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g);  
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
          RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 

     this.standardDraw(drawObjects,g2); 
    } 
} 

基本上,我想这是“标准方式”这个基地吸引面板如果paintComponent没有在派生类中重写。所以,我有一个派生类称为AspectRatioPanel,我想重新指定它是如何得出的事情:

public class AspectRatioPanel extends BasePanel { 

    ... 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g);  
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
          RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 

     // Get ViewPort Bounding Box to clip 
     BoundingBox viewPortBoundingBox = this.getViewPortBoundingBox(); 

     // Clip to viewport 
     g2.setClip((int)viewPortBoundingBox.topLeft.getX(),(int)viewPortBoundingBox.topLeft.getY(),(int)viewPortBoundingBox.getWidth(),(int)viewPortBoundingBox.getHeight()); 

     this.standardDraw(drawObjectsBuf,g2); 
    } 
} 

我遇到的问题是在派生类中调用super.paintComponent(g)。我打算在JComponent中拨打paintComponent,但首先要经过BasePanel。有没有更好的方法来解决这个问题?我可以删除BasePanel中的paintComponent方法,但使用标准绘图方法对我很有用。我也无法直接呼叫JComponent.paintComponent,因为它是protected。有没有解决方案?另外,我在做一些概念上的错误?

+0

我想知道你是否想要实现一个共享接口,并且可能共享相同的组合组件以允许共享行为,而不是在这里使用继承。 – 2014-09-19 14:14:47

+0

你可能想看看[这个问题](http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java)。 – Rob 2014-09-19 14:21:56

+0

另一种方式,如果面板在其他方面是相同的,只是有一个实现,有可能工作在纵横比保存模式。 – kiheru 2014-09-19 14:24:37

回答

4

也许我误解你的问题,但我会单独的标准和风俗画

public abstract class BasePanel extends JPanel { 

...  

    @Override 
    protected void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    provideCustomPainting(g); 
    } 

    protected void provideCustomPainting(Graphics g) { 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
         RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 

    this.standardDraw(drawObjects,g2); 
    } 
} 

public class AspectRatioPanel extends BasePanel { 
    protected void provideCustomPainting(Graphics g) { 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
         RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); 

    // Get ViewPort Bounding Box to clip 
    BoundingBox viewPortBoundingBox = this.getViewPortBoundingBox(); 

    // Clip to viewport 
    g2.setClip((int)viewPortBoundingBox.topLeft.getX(),(int)viewPortBoundingBox.topLeft.getY(),(int)viewPortBoundingBox.getWidth(),(int)viewPortBoundingBox.getHeight()); 

    this.standardDraw(drawObjectsBuf,g2); 
    } 
} 
+0

''也许我误解了你的问题,......“ - 不,这个答案看上去对我来说很重要。 100+ – 2014-09-19 14:25:55

+0

这将工作,我会继续并接受它。我想知道我能否以更好的方式处理它。谢谢! – Justin 2014-09-19 14:36:21

1

你可以简单地呼叫super.paintComponent方法(图形);通过覆盖paintComponent(),您有3个选项:

a。)在方法开始时调用super;您可以在超级课堂上绘制的代码上绘制代码涂料。

b。)根本不要调用super - 您的paintComponent需要确保它能够绘制所需的所有东西;如果组件是不透明的,那意味着您需要绘制组件占据的整个区域。 c)以方便的方式致电超级会员;无论在超级中画什么,都会按照您所说的顺序依次“分层”。只有超级方法不绘制整个区域时才有意义。

如果硬要在这两者之间使用由特定类的继承层次为super.paintComponent方法的的paintComponent,无论继承层次的,也可能这就是:

BasePanel extends JPanel { 
    protected final defaultPaintComponent(Graphics g) { 
     super.paintComponent(g); 
    } 
} 

子类可以称之为“defaultPaintComponent”,而不是super.paintComponent,从而绕过定义的层次结构之间的任何实现类(我建议最终声明它以防止意外覆盖)。

+0

我很欣赏这些建议。这是我将不得不更多考虑的事情。 – Justin 2014-09-19 14:46:23