首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >重写paintComponent两次

重写paintComponent两次
EN

Stack Overflow用户
提问于 2014-09-19 14:08:32
回答 2查看 213关注 0票数 1

这更像是一个概念性的问题,所以很难发布一个小的、可行的代码示例。但是,我在这里有一个覆盖paintComponent的类:

代码语言:javascript
代码运行次数:0
运行
复制
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的派生类,我想重新指定它如何绘制东西:

代码语言:javascript
代码运行次数:0
运行
复制
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中调用JComponent,但它首先要通过BasePanel。有没有更好的方法来解决这个问题?我可以在paintComponent中删除BasePanel方法,但是有一种标准的绘制方法对我很有用。我似乎也不能直接调用JComponent.paintComponent,因为它是protected。有什么解决办法吗?还有,我是不是做错了概念上的事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-19 14:24:35

也许我误解了你的问题,但我会把标准画和定制画分开。

代码语言:javascript
代码运行次数:0
运行
复制
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);
  }
}
票数 4
EN

Stack Overflow用户

发布于 2014-09-19 14:38:56

您可以简单地不调用super.paintComponent(图形);通过覆盖paintComponent(),您有三个选项:

a.)在方法开始时调用Super;在超类绘制的基础上绘制代码。

b.)根本不要调用超级程序--您的paintComponent需要确保它绘制所需的所有内容;如果组件是不透明的,这意味着您需要绘制组件所占用的整个区域。

c.)在你的方便点调用超级;在超级画的任何东西看起来都是按你所说的顺序“分层”的。只有当超级方法没有画出整个区域时才有意义。

如果您坚持将继承层次结构的特定类中的paintComponent作为super.paintComponent使用,而不管两者之间的继承层次结构如何,这也是可能的:

代码语言:javascript
代码运行次数:0
运行
复制
BasePanel extends JPanel {
     protected final defaultPaintComponent(Graphics g) {
         super.paintComponent(g);
     }
}

子类可以调用"defaultPaintComponent“而不是super.paintComponent,从而绕过在定义的层次结构中的任何实现类(我建议将其声明为最终,以防止意外覆盖)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25935915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档