【问题标题】:Java Upper Boundary GraphicsJava 上边界图形
【发布时间】:2014-03-31 16:26:26
【问题描述】:

关于这个基本碰撞检测的短视频:

https://www.youtube.com/watch?v=ptqhnmP8FY0&list=PL6E90696571998DC2

谁能告诉我为什么上边界需要是球的大小?我认为从左上角开始绘制一个椭圆形的边界矩形。如果是这种情况,那么 y==0 似乎是上限,但显然不是这样。

总结问题:如果边界三角形从左上角开始,为什么上边界是 20 而不是 0。

代码如下:

public class JavaGame extends JFrame {

int x,y,sizeX = 350,sizeY=350;
//boolean erase = false;

private Image dbImage;
private Graphics dbg;

public class AL extends KeyAdapter{

    public void keyPressed(KeyEvent e){
        int keyCode = e.getKeyCode(); 

        if (keyCode == e.VK_LEFT){

            if(x<= 0)
                x=0;
            else
                x-=5;
        }
        if (keyCode == e.VK_RIGHT){
            if(x==sizeX-20)
                x=sizeX-20;
            else
                x+=5;
        }if (keyCode == e.VK_UP){
            if(y==20)
                y=20;
            else
            y-=5;
        }if (keyCode == e.VK_DOWN){
            if(y==sizeY-20)
                y=sizeY-20;
            else
            y+=5;
        }

        /*if (keyCode == e.VK_S){
            erase = true;
        }*/
    }
    public void keyReleased(KeyEvent e){

    }
}

public JavaGame(){
    addKeyListener(new AL());
    x=y=150;
    setTitle("Java Game");
    setBackground(Color.WHITE);
    setSize(sizeX,sizeY);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


public void paint(Graphics g){

    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);

}

public void paintComponent(Graphics g){

    g.fillOval(x, y, 20, 20);

    /*if(erase){
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 500, 500);
        erase = false;
    }*/

    repaint();


}

public static void main(String[] args) {


    new JavaGame();

}

}

【问题讨论】:

    标签: java swing graphics


    【解决方案1】:

    主要问题是,覆盖JFramepaint 允许您在框架装饰下进行绘制。

    这是您应该避免在顶级容器上覆盖 paint 的众多原因之一。

    如上所述:

    在 Swing 中,通常建议在从 JComponent 扩展的组件的 paintComponent 方法中执行自定义绘制,例如 JPanel

    这不仅允许您将输出与特定容器(JFrame)解耦,还可以确保在添加到顶级容器时,它只占用窗口的可视区域,不会在框架下渲染边框。

    基于JComponent 的组件也受益于双缓冲,这意味着您不需要实现自己的双缓冲策略,但它不会在重绘之间闪烁

    此外,您必须在执行任何自定义绘画之前调用 super 方法,否则可能会产生绘画工件

    查看Painting in AWT and SwingPerforming Custom Painting 了解更多详情

    旁注:

    您还应该避免使用KeyListener 的用户,因为他们因关注焦点相关问题而臭名昭著。相反,您应该使用Key Bindings API

    【讨论】:

      【解决方案2】:

      它是JFrame 标题栏的高度,这就是为什么y 在 22 之后开始可见。

      由于JFrame 外边框宽度,x 从 2 开始可见。

      这里是示例代码以及快照

          g.setColor(Color.RED);
          g.drawRect(3, 22, 200, 200);
      

      --编辑--

      我从不建议你使用它。请阅读下面的 cmets 了解它的缺点。

      【讨论】:

      • 这意味着该数字在具有不同标题栏高度的不同操作系统上会有所不同......所以最好将所有逻辑移动到控件inside框架,而不是在框架本身内部进行。
      • 是的,您是对的,我们也可以在同一操作系统上使用不同的主题对其进行验证。
      • 现在在不同的外观和/平台下运行它,这将不再有效
      • 我不知道为什么它又被否决了。 OP 想知道什么 - 摘要问题:如果边界三角形从左上角开始,为什么上边界是 20 而不是 0。 OP 不是在寻找解决方案,但我也尊重您的所有建议。
      • 答案被否决主要是因为它是不好的和限制性的建议。真正的答案是不要覆盖顶级容器的油漆。虽然从技术上讲它可能会解决这个问题的实例,但它会继续促进 API 的不当使用,这只会导致操作人员陷入更多麻烦
      猜你喜欢
      • 2014-09-22
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2014-03-20
      • 2015-07-13
      • 2020-05-26
      相关资源
      最近更新 更多