当前位置: 首页 > 知识库问答 >
问题:

JFrame向帧顶部添加22像素偏移量(java.awt.Insets)

盖雪峰
2023-03-14

我正在创建一个简单的爆发式游戏。主游戏扩展了JFrame,我在框架中添加了一个JPanel。

当我使用paint()绘制游戏图形时,项目按预期放置在窗口内(即通过其x,y坐标)。

我已经更新了使用BufferStrategy的代码,因为我正在闪烁。自,被渲染的图形被偏移22px。

这意味着砖块从屏幕顶部脱落!

代码如下:

package BreakOut;

import javax.swing.*;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;


public class Game extends JPanel implements KeyListener{

GameStateManager gsm = new GameStateManager();
BufferStrategy strategy;

public Game() {

    //add menu state to GameStateManager
    gsm.add(new MenuState(gsm));
    createFrame();


    while(true)
    {
        gsm.update();
        //repaint();
        render();
        try{
            Thread.sleep(10);
        }
        catch(InterruptedException e)
        {

        }
    }
}


public void createFrame()
{
    JFrame frame = new JFrame("Mini Tennis");
    frame.setLayout(new BorderLayout());
    this.setPreferredSize(new Dimension(400,400));
    frame.add(this);        
    frame.pack();       
    frame.setBackground(Color.BLACK);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(this);
    this.setFocusable(true);
    frame.createBufferStrategy(2);
    strategy = frame.getBufferStrategy();
    frame.setVisible(true);
    System.out.println(frame.getInsets());
}


public void render()
{
    Graphics g = strategy.getDrawGraphics();
    super.paint(g);
    gsm.render(g);
    g.dispose();
    strategy.show();
}


public void keyPressed(KeyEvent k) {
    switch(gsm.getState())
    {
        case MAIN_MENU:
        if(k.getKeyCode()==KeyEvent.VK_ENTER)
        {
            //add the PlayState to the Stack and update enum value
            gsm.add(new PlayState(gsm, this));
        }
        break;
        case PLAYING:
            if(k.getKeyCode()==KeyEvent.VK_P)
            {
                //add the PlayState to the Stack and update enum value
                gsm.add(new PauseState(gsm));
            }
            break;
        case PAUSE:
            if(k.getKeyCode()==KeyEvent.VK_P)
            {                   
                gsm.pop();
            }
            break;
        case GAME_OVER:
            if(k.getKeyCode()==KeyEvent.VK_ENTER)
            {                   
                gsm.pop();
            }
            break;
    }
    //send input to GameStateManager
    gsm.keyPressed(k.getKeyCode()); 
}

public void keyReleased(KeyEvent k) {
    gsm.keyReleased(k.getKeyCode());        
}

public void keyTyped(KeyEvent k) {
    gsm.keyTyped(k.getKeyCode());   
}


public static void main(String[] args) {
    new Game();

}

}

当我输出系统。出来println(frame.getInsets());我明白了

java.awt.Insets[top=22,left=0,bottom=0,right=0]

我显然做错了什么,但不明白为什么添加BufferStrategy会让JPanel被22px抵消

任何帮助将不胜感激:)

共有1个答案

阎乐池
2023-03-14

框架有边框和装饰,它们包含在框架的边界内(它们不会添加到外部),从使用MacOS的外观来看,顶部的22像素是窗口标题。

最好的解决方案是,不要使用帧作为渲染曲面,而是使用游戏类。这意味着它需要从java扩展。awt。画布而不是javax。摆动JPanel,您需要从中创建缓冲策略

如果覆盖CanvasgetPreferredSize方法,可以在框架上使用pack,它将围绕此框架打包窗口,因此物理框架将比内容大,但内容将是您希望的大小

您还需要将主/游戏循环移动到单独的线程,因为这是当前阻塞事件调度线程的风险,这可能会导致您没有结束的问题(例如从未获得关键事件)

 类似资料:
  • 问题内容: 我已经看到了几种有神论的方法,它们似乎都起作用,但是我只是想知道一种方法是否比另一种更好。 例如,一个叫你可以这样做: 您还可以执行以下操作: 这些“正确”之一吗? 问题答案: 来自类javadoc的文字副本 JFrame类与Frame略有不兼容。像所有其他JFC / Swing顶级容器一样,JFrame包含JRootPane作为其唯一的子级。根窗格提供的内容窗格通常应包含JFrame

  • 问题内容: 我在同一张图上绘制了多个seaborn点图。x轴是序数,而不是数字。每个点图的序数值都相同。我想将每个图稍微移到一边,pointplot(dodge = …)参数的方式是在单个图内的多条线内进行,但是在这种情况下,是要在彼此之上绘制多个不同图。我怎样才能做到这一点? 理想情况下,我想要一种适用于任何matplotlib图的技术,而不仅仅是专门针对海洋的技术。由于数据不是数字,因此很难为

  • 在IE6及更低版本中,当一个浮动元素与一个非浮动元素相邻时,在非浮动元素中,会莫名的为靠近浮动元素的内容添加 3 像素的间隙。 假设在一个容器中,有两个元素: <div id="wrapper">     <div class="fl">float</div>     <p>...</p> </div> 左侧的 div 元素向左浮动,而右侧的 p 元素不浮动: .fl {    float:

  • 我对javascript比较陌生,所以我对这个问题感到挠头。我有一大堆跨度,都在同一条线上。但当我得到所有span元素的顶部并进行比较时,它表示不相同,但在控制台中,我可以看到所有span的值都是相同的,即8。我是不是错过了什么。 null null

  • 我只需要添加一个边距顶部,这样,如果我的图像是用这个js: 我知道这可能很简单,但我是个初学者。希望有人能教我怎么做。谢谢!

  • 问题内容: 是否可以跳过X个第一行,并在一个查询中选择所有其他行?像那样: 它将选择:pqr,stu,vwx,yz 我尝试使用LIMIT和OFFSET完成此操作,但是问题是表是动态的,而且我不知道应该输入哪个LIMIT(我不知道表中有多少行)。 问题答案: 如果只需要最后N行,请尝试以下操作: 这会根据的顺序为您提供最后几条记录。 您可以使用自动递增的主键(希望有一个主键)来确定行的顺序(如果无法