我正在尝试在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);
}
}
答案 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.")
}
即可。