【问题标题】:Java JFrame is not exactly sizedJava JFrame 的大小不准确
【发布时间】:2013-02-28 22:38:42
【问题描述】:

我正在尝试编写一个游戏,但我无法准确地制作我需要的大窗口。 第一个 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;
  }
}

【问题讨论】:

  • Thread.sleep(10); 而不是调用 Thread.sleep(n) 实现 Swing Timer 以重复任务。有关详细信息,请参阅Concurrency in Swing

标签: java swing concurrency jframe paint


【解决方案1】:

setResizable() 可能会影响框架的插图。最好在setResizable() 之后调用 pack()。试试这个调用顺序:

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

供参考,请参阅@HovercraftFullOfEels 的this 分析

您可能还会发现Should I avoid the use of set[Preferred|Maximum|Minimum]Size methods in Java Swing? 很有帮助。

【讨论】:

  • +1 很好,我总是忘记这一点(但话说回来,我不喜欢不可修复的框架;))
  • @MadProgrammer 是的,完全一样,这里一样 :)
【解决方案2】:

我注意到您只是在设置 Board 首选大小。如果你想为你的窗口强制一个特定的大小,你可以简单地调用方法JFrame.setSize()xCopterGame

我鼓励你看看这个link。当您使用 LayoutManager 时,还有其他方法可以实现 Swing UI 而无需处理此类问题。

【讨论】:

  • Windows 有边框和其他内容被“挤压”到框架边界中,这意味着内容空间比预期的要小。 OP正在做的实际上是正确的。设置内容的首选大小并让框架将其内容添加到外部,因此生成的框架大小应该大于内容的首选大小。我认为 Aqua 击中了头
  • 同意@MadProgrammer - 这只是走错路了。 -1 表示第一段,+1 表示第二段引用 Java 教程链接。布局管理器。净 0。
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多