gpt4 book ai didi

java - JFrame 导出到 Jar 时会扩展

转载 作者:行者123 更新时间:2023-12-01 21:45:33 24 4
gpt4 key购买 nike

美好的一天,我正在构建一些基本的贪吃蛇游戏,以了解有关 java 中的线程和图形的更多信息。在我的 Eclipse 项目中,所有代码方面的工作并不完美,但足以满足我的喜好。现在我尝试将该项目从 Eclipse 导出到可运行的 .jar 文件,不知何故突然框架的大小与我分配的大小不同,并且所有内容突然都比应有的大,这也与我设置为“边框”的矩形混淆“对于比赛 field 等等。我使用选项“将所需的库打包到生成的 jar 中”导出为可运行 JAR 文件。任何人都知道这是为什么,以及我可以做些什么来修复它或优化我的程序以解决这些问题?这是我使用该框架的所有内容的代码:

import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Grid extends Canvas{

private JFrame _container;
private int _size;

private int[] food;

private boolean running;
private boolean alive;

private Snake s;
private Rectangle _border;

private int score;
private int highscore;

private BufferStrategy bs;

public Grid() {
super();

_container = new JFrame("Snake Final");
_container.setSize(622,656);
_container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
_container.setVisible(true);

setSize(600, 600);
setVisible(true);

_container.add(this);

createBufferStrategy(2);
bs = getBufferStrategy();

food = new int[2];
highscore = 0;

init();
}

private void init() {
_size = 30;
_border = new Rectangle(0,0,getWidth(),getHeight());
s = new Snake(_size, _border, this);

setKeyListener();
running = true;

generateFood();

run();

}

public void run() {
running = true;
while(running) {
s.update();
if(s.checkFood(food)) {
generateFood();
}
draw();

try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}

public void gameOver() {
alive = false;
if(score > highscore) {
highscore = score;
}
Graphics g = this.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.white);

// g.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
// g.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);


}

private void setKeyListener() {
this.addKeyListener(new KeyListener() {

@Override
public void keyPressed(KeyEvent arg0) {

if(arg0.getKeyCode() == KeyEvent.VK_W) {
if(running) {
if(s.getYDir() == 0) {
s.changeDirection(0, -1);
}
}
}
else if(arg0.getKeyCode() == KeyEvent.VK_S) {
if(running) {
if(s.getYDir() == 0) {
s.changeDirection(0, 1);
}
}
}
else if(arg0.getKeyCode() == KeyEvent.VK_A) {
if(running) {
if(s.getXDir() == 0) {
s.changeDirection(-1, 0);
}
}
}
else if(arg0.getKeyCode() == KeyEvent.VK_D) {
if(running) {
if(s.getXDir() == 0) {
s.changeDirection(1, 0);
}
}
}
else if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
alive = true;
s.setPosition(4 * _size, 4 * _size);
s.changeDirection(1, 0);
}
}

@Override
public void keyReleased(KeyEvent arg0) {}

@Override
public void keyTyped(KeyEvent arg0) {}
});
}

private void generateFood() {
int gridParts = (getWidth()/_size) - 4;
for(int i = 0; i < food.length; i++) {
food[i] = ((int) (Math.random() * (gridParts)) * _size) + 2 * _size;
}
}

private void draw() {
Graphics bg = bs.getDrawGraphics();
bg.clearRect(0, 0, getWidth(), getHeight());
if(alive) {

Graphics2D bg2d = (Graphics2D) bg;

bg2d.setStroke(new BasicStroke(_size*4));
bg2d.drawRect(0,0,getWidth(),getHeight());

s.show(bg2d);
// bg2d.fillRect(food[0] * _size, food[1] * _size, _size, _size);

score = s.getSize();

bg.setColor(Color.white);
bg.setFont(new Font("SansSerif", Font.PLAIN, 20));
bg.drawString(String.valueOf(score), 56, 35);

bg2d.setColor(Color.RED);
bg2d.fillRect((food[0] + 5), (food[1] + 5), _size - 10, _size - 10);

bg2d.dispose();
}
else {
bg.setColor(Color.black);
bg.fillRect(0, 0, getWidth(), getHeight());

bg.setColor(Color.white);
bg.setFont(new Font("SansSerif", Font.PLAIN, 20));
bg.drawString("Game Over", getWidth() / 2 - 55, getHeight() / 2 - 50);
bg.drawString("Score: " + String.valueOf(score), getWidth() / 2 - 55, getHeight() / 2 - 20);
bg.drawString("Highscore: " + String.valueOf(highscore), getWidth() / 2 - 55, getHeight() / 2 + 10);
bg.drawString("Press Enter to restart", getWidth() / 2 - 55, getHeight() / 2 +40);
}
bs.show();
bg.dispose();
}

}

抱歉,这是一种非常困惑的代码,但正如老话所说,如果它实际上工作得还不错,为什么要重构它

最佳答案

    _container = new JFrame("Snake Final");
_container.setSize(622,656);
_container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
_container.setVisible(true);

setSize(600, 600);
setVisible(true);

_container.add(this);

您不应该对组件的大小进行硬编码。面板的大小将被忽略,因为 Swing 被设计为与布局管理器一起使用。默认的 BorderLayout 将根据框架中的可用空间设置 Canvas 的大小。

相反,您向布局管理器提出建议。代码应该类似于:

    _container = new JFrame("Snake Final");
_container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//setSize(600, 600);
//setVisible(true); // not needed components are visible by default
setPreferredSize( new Dimension(600, 600) );
_container.add(this);

//_container.setSize(622,656);
_container.pack();
_container.setVisible(true);

因此,组件在 pack() 之前添加到框架中,并且框架变得可见。然后框架的大小将由 pack() 方法正确确定。它将包括 Canvas 的首选尺寸,并允许装饰框架(边框和标题栏)。

不知道这是否会解决您创建 Jar 文件的问题(也许有一些属性会覆盖打包大小?),但这是 Swing 框架更好的设计方法。

关于java - JFrame 导出到 Jar 时会扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com