Java JFrame打开得太小了

时间:2016-02-02 21:49:08

标签: java jframe

我正在尝试在java中创建PingPong,但是我遇到了为球创建边界的麻烦。经过测试,我发现JFrame打开得太小了;我将宽度设置为500,JFrame以484像素打开。这是为什么?

这是我的游戏课程:

公共类游戏扩展了Canvas {

gcc -o main main.c && ./main

}

这是我的JFrame类:

public class Display扩展了JFrame {

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

Display d;


public Game(){
    d = new Display(this);
    requestFocus();
}


public void start(){
    System.out.println("Game started.");
}
public void stop(){

}


public void paint(Graphics g){
    g.setColor(Color.DARK_GRAY);
    g.fillRect(0, 0, 500, 400);
    g.setColor(Color.GREEN);
    g.drawLine(483, 0, 483, 399);
    g.drawLine(0, 399, 499, 399);
}

}

2 个答案:

答案 0 :(得分:2)

当您在setSize上拨打JFrame时,它会包含标题栏的大小以及窗口周围的任何其他装饰。因此,您拥有的实际可绘制区域将略微少于此。您可以通过设置Game的首选尺寸并使用pack上的JFrame来解决此问题。

因此,如果您将代码更改为:

public Display(Game game){
    super("PingPong");
    screenSize = new Dimension(500, 400);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(true);
    game.setPreferredSize(screenSize);

    setLocationRelativeTo(null);
    add(game);
    pack();
    setVisible(true);
    game.start();
}

它会起作用。这告诉你的实际游戏它想要的大小(500x400),然后调整帧大小以便它可以完全包含它。这将使您在实际绘图中使用500x400像素。

请注意,我删除了所有frame引用。由于Display本身已经是JFrame,因此您不需要创建另一个Display。只需使用{{1}}对象本身。

答案 1 :(得分:0)

只需删除 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main_activity) Log.d(TAG, "On create called. Score is $Score") setSupportActionBar(toolbar) fab.setOnClickListener { view -> Snackbar.make( view, "Replace with your own action", Snackbar.LENGTH_LONG ) .setAction("Action", null).show() } override fun onSaveInstanceState( outState: Bundle?, outPersistentState: PersistableBundle? ) { super.onSaveInstanceState(outState, outPersistentState) outState?.putInt(SCORE_KEY, Score) outState?.putLong(TIME_LEFT_KEY, timeLeftonTimer) countDownTimer.cancel() Log.d(ContentValues.TAG, "onSaveInstanceState : Saving score : $Score & Saving Time current $timeLeftonTimer") } override fun onDestroy() { super.onDestroy() Log.d(ContentValues.TAG, "onDestroy called.") } 即可。