Java JFrame 的大小不准确

标签 java swing concurrency jframe paint

我正在尝试编写游戏程序,但无法制作出我需要的大窗口。 第一个 println 给我720,第二个给我732,窗口确实比720大。 如何使游戏显示高度恰好为 720 像素?

xCopterGame.java

import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.event.*;

public class xCopterGame extends JFrame implements MouseListener{

  private static final long serialVersionUID = 1L;

  Board panel=null;
  public xCopterGame(){
    panel = new Board();
    setTitle("Pong");
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    panel.setPreferredSize(new Dimension(1280,720));
    getContentPane().add(panel);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
    setResizable(false);

    System.out.println(panel.getHeight());

    panel.yCopter = getHeight()/2-15;

    panel.addMouseListener(this);
    addMouseListener(this);
  }

  public void mousePressed(MouseEvent e) {
    panel.mousePressed(e);
  }

  public void mouseReleased(MouseEvent e) {
    panel.mouseReleased(e);
  }

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


  public void mouseClicked(MouseEvent e) {

  }
  public void mouseEntered(MouseEvent e) {

  }
  public void mouseExited(MouseEvent e) {

  }
}

Board.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;

public class Board extends JPanel implements Runnable{
  private static final long serialVersionUID = 1L;

  Thread th=null;
  boolean mousePressed = false, firstClick = false;
  int yCopter;

  public Board(){
    th = new Thread(this);
    th.start();
  }

  public void paint(Graphics g){
    super.paint(g);
    this.setBackground(Color.black);
    g.setColor(Color.white);
    g.fillRect(80, yCopter, 30, 30);

    g.setColor(Color.gray);
    for(int i=0; i<37; i++){
      g.drawLine(0, i*20, this.getWidth(), i*20);
    }

    g.fillRect(100, 715, 30, 5);
    g.fillRect(100, 0, 30, 5);       
    System.out.println(this.getHeight());
  }

  public void run() {
    while(true){
      if(mousePressed == true)
        yCopter--;
      if(mousePressed == false && firstClick == true)
        yCopter++;

   //   repaint();

      try { 
        Thread.sleep(10); 
      } 
      catch(InterruptedException ex) {

      }
    }
  }

  public void mousePressed(MouseEvent e) {
    mousePressed = true;
    firstClick = true;
  }
  public void mouseReleased(MouseEvent e) {
    mousePressed = false;
  }
}

最佳答案

setResizing() 可能会影响框架的插入。最好在 setResizing() 之后调用 pack()。尝试以下调用顺序:

setResizable(false);
pack();
setVisible(true);

有关引用,请参阅this @HovercraftFullOfEels 分析

您还可以找到Should I avoid the use of set[Preferred|Maximum|Minimum]Size methods in Java Swing?有帮助。

关于Java JFrame 的大小不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15147046/

相关文章:

java - 鼠标的坐标?

java - 连续为多个可变字段赋值的操作是否可以重新排序?

java - 在 play 框架中获取 JDBC 连接(java)

java - 如何在不访问目标表的情况下从 JPA ManyToOne 映射中检索外键?

java - 覆盖 VK_Tab 焦点操作

java - 关闭程序时运行方法?

concurrency - R界等待彼得森锁

javascript - Elm 中的并发

Java:快速获取数据:存储在内存中与从文件中读取

java - 初始化二维对象数组时出现问题