首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JFrame将22像素偏移(java.awt.Insets)添加到帧顶部

JFrame将22像素偏移(java.awt.Insets)添加到帧顶部
EN

Stack Overflow用户
提问于 2015-01-24 20:17:47
回答 1查看 1.9K关注 0票数 0

我正在创建一个简单的突破风格的游戏。主游戏扩展了JFrame,我在框架中添加了一个JPanel。

当我使用paint()来绘制游戏图形时,项目如预期的那样位于窗口内(即通过它们的x,y坐标)。

我已经更新了代码以使用BufferStrategy,因为我得到了闪烁。由于,渲染的图形偏移了22px。

这意味着砖块离开了屏幕的顶部!

代码如下:

代码语言:javascript
复制
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();

}

}

当我输出System.out.println(frame.getInsets())时,我得到

代码语言:javascript
复制
java.awt.Insets[top=22,left=0,bottom=0,right=0]

我显然做错了什么,但是我不明白为什么添加BufferStrategy会创建偏移22px的JPanel

如有任何帮助,我们将不胜感激:)

EN

回答 1

Stack Overflow用户

发布于 2015-01-24 20:37:45

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

最好的解决方案是,不要使用帧作为渲染表面,而是使用Game类。这意味着它将需要从java.awt.Canvas而不是javax.swing.JPanel进行扩展,并且您将需要从它创建BufferStrategy

如果你覆盖了CanvasgetPreferredSize方法,你可以在框架上使用pack,它会围绕这个包装窗口,所以物理框架会比内容大,但是内容的大小是你想要的大小

您还需要将主/游戏循环移动到单独的线程,因为这是当前阻塞事件分派线程的风险,这可能会导致无休止的问题(比如永远不会获得关键事件)。

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

https://stackoverflow.com/questions/28125372

复制
相关文章

相似问题

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