Java 上边界图形

标签 java swing graphics

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

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();

}

}

最佳答案

主要问题是,重写 JFramepaint 允许您在框架装饰下绘画。

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

正如所讨论的:

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

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

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

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

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

旁注:

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

关于Java 上边界图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722777/

相关文章:

java - 相当于什么button3_Click(sender, e);在Java中?

javascript - 生成星空的算法

java - JPA 实体类和 SQL 查询从 MySQL 检索数据

java - 在 if/else 命令下读取字符串值

java - 在 Java 中打印 Unicode 占星符号

java - JButton 仅出现在 MouseEnter 上

algorithm - 最短路径和测地线

Java,从文件中读取对象并将它们添加到数组列表中

JDBC 的 Java 线程

java - 如何在 EDT (Java Swing) 上运行“另存为”菜单