元件尺寸问题!(Component size problem! Resizes to parent's size for reasons I'm unaware of!)

编程入门 行业动态 更新时间:2024-10-24 14:17:02
元件尺寸问题!(Component size problem! Resizes to parent's size for reasons I'm unaware of!)

我似乎无法弄清楚为什么会发生这种情况......

我的serverPaddle(它基于一个java.awt.Component)没有出现正确的大小。 我已经放置了System.out.println(serverPaddle.getSize()); 在线程循环中,它显示组件是1循环的正确大小,然后是下一个,之后它与父容器(Container)的大小相同。

import javax.swing.JFrame; import java.awt.Container; import java.awt.Color; import java.awt.Graphics; private final int FRAMERATE = 60, THIS_MUCH = 1000/FRAMERATE, BALL_DIAMETER = 30, BALL_SPEED = 15, PADDLE_WIDTH = 15, PADDLE_HEIGHT = 60, PADDLE_SPEED = 30; private final Color BALL_COLOR = Color.WHITE, PADDLE_COLOR = Color.WHITE; private Container c; private Ball puck; private Paddle serverPaddle, clientPaddle; ... private Container c; ... c = getContentPane(); ... public void run() { //Center puck puck = new Ball(c.getWidth()/2 - BALL_DIAMETER/2, c.getHeight()/2 - BALL_DIAMETER/2, BALL_SPEED); puck.setSize(BALL_DIAMETER, BALL_DIAMETER); puck.setForeground(BALL_COLOR); puck.createHitbox(); puck.setMoving(true); //West paddle serverPaddle = new Paddle(PADDLE_WIDTH, c.getHeight()/2 - PADDLE_HEIGHT/2, PADDLE_SPEED); serverPaddle.setSize(PADDLE_WIDTH, PADDLE_HEIGHT); serverPaddle.setForeground(PADDLE_COLOR); serverPaddle.createHitbox(); c.add(puck); c.add(serverPaddle); //Draw at FRAMERATE frames per second while (true) { System.out.println(serverPaddle.getSize()); puck.move(determineSituation()); puck.repaint(); wait(THIS_MUCH); } }

这是Paddle类

import java.awt.Graphics; import java.awt.Color; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; public class Paddle extends GameObject implements KeyListener { private int x = 0, y = 0; public Paddle(int x, int y, int speed) { super(speed); this.x = x; this.y = y; } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void paint(Graphics g) { setLocation(x, y); //These two are the culprits, the size is correct when //I use constants instead. g.fillRect(0, 0, **getWidth()**, **getHeight()**); updateHitbox(); } }

我的GameObject类...

import java.awt.Component; import java.awt.Rectangle; public class GameObject extends Component { /* Members */ private int speed = 0; private boolean isMoving = false; private Rectangle hitbox; //Dead south = 0 radians, anti-clockwise private double direction = 0; public GameObject(int speed) { this.speed = speed; } /* Accessors */ public boolean isMoving() { return isMoving; } public void setMoving(boolean isMoving) { this.isMoving = isMoving; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public double getDirection() { return direction; } public void setDirection(double direction) { this.direction = direction; } public Rectangle getHitbox() { return hitbox; } public void createHitbox() { hitbox = new Rectangle(getX(), getY(), getWidth(), getHeight()); } public void createHitbox(int x, int y, int width, int height) { hitbox = new Rectangle(x, y, width, height); } public void updateHitbox() { hitbox.setLocation(getX(), getY()); } }

即使我将所有代码注释为Ball / puck,它都不起作用。 注释掉“等待”方法也不起作用。 它只是以某种方式变化,我不知道,但我真的想知道,所以我可以修正这件事!11

帮帮我! 谢谢。

顺便说一下,等待只是调用Thread.sleep

public void wait(int durationInMilliseconds) { try { Thread.sleep(durationInMilliseconds); } catch (InterruptedException e) { System.out.println(e); } }

I can't seem to figure out why this is happening...

My serverPaddle (it's based on a java.awt.Component) isn't coming out the right size. I've placed System.out.println(serverPaddle.getSize()); in the thread loop and it shows that the component is the right size for 1 loop and then the next and thereafter, it's the same size as the parent (Container).

import javax.swing.JFrame; import java.awt.Container; import java.awt.Color; import java.awt.Graphics; private final int FRAMERATE = 60, THIS_MUCH = 1000/FRAMERATE, BALL_DIAMETER = 30, BALL_SPEED = 15, PADDLE_WIDTH = 15, PADDLE_HEIGHT = 60, PADDLE_SPEED = 30; private final Color BALL_COLOR = Color.WHITE, PADDLE_COLOR = Color.WHITE; private Container c; private Ball puck; private Paddle serverPaddle, clientPaddle; ... private Container c; ... c = getContentPane(); ... public void run() { //Center puck puck = new Ball(c.getWidth()/2 - BALL_DIAMETER/2, c.getHeight()/2 - BALL_DIAMETER/2, BALL_SPEED); puck.setSize(BALL_DIAMETER, BALL_DIAMETER); puck.setForeground(BALL_COLOR); puck.createHitbox(); puck.setMoving(true); //West paddle serverPaddle = new Paddle(PADDLE_WIDTH, c.getHeight()/2 - PADDLE_HEIGHT/2, PADDLE_SPEED); serverPaddle.setSize(PADDLE_WIDTH, PADDLE_HEIGHT); serverPaddle.setForeground(PADDLE_COLOR); serverPaddle.createHitbox(); c.add(puck); c.add(serverPaddle); //Draw at FRAMERATE frames per second while (true) { System.out.println(serverPaddle.getSize()); puck.move(determineSituation()); puck.repaint(); wait(THIS_MUCH); } }

This is the Paddle class

import java.awt.Graphics; import java.awt.Color; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; public class Paddle extends GameObject implements KeyListener { private int x = 0, y = 0; public Paddle(int x, int y, int speed) { super(speed); this.x = x; this.y = y; } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void paint(Graphics g) { setLocation(x, y); //These two are the culprits, the size is correct when //I use constants instead. g.fillRect(0, 0, **getWidth()**, **getHeight()**); updateHitbox(); } }

My GameObject class...

import java.awt.Component; import java.awt.Rectangle; public class GameObject extends Component { /* Members */ private int speed = 0; private boolean isMoving = false; private Rectangle hitbox; //Dead south = 0 radians, anti-clockwise private double direction = 0; public GameObject(int speed) { this.speed = speed; } /* Accessors */ public boolean isMoving() { return isMoving; } public void setMoving(boolean isMoving) { this.isMoving = isMoving; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public double getDirection() { return direction; } public void setDirection(double direction) { this.direction = direction; } public Rectangle getHitbox() { return hitbox; } public void createHitbox() { hitbox = new Rectangle(getX(), getY(), getWidth(), getHeight()); } public void createHitbox(int x, int y, int width, int height) { hitbox = new Rectangle(x, y, width, height); } public void updateHitbox() { hitbox.setLocation(getX(), getY()); } }

even when I comment all the code out for the Ball/puck, it doesn't work. Commenting out the "wait" method doesn't work as well. It just somehow changes for some reason that I don't know but I really wanna know SO I CAN FIX THIS THING!!11

Help! Thanks.

By the way, wait is just calling Thread.sleep

public void wait(int durationInMilliseconds) { try { Thread.sleep(durationInMilliseconds); } catch (InterruptedException e) { System.out.println(e); } }

最满意答案

首先,这是一个非常多的代码。 你希望能够减少问题,使它足够小,变得微不足道。 如果您希望其他人提供帮助,那么能够生成一个完整的,可编辑的程序来显示问题,而不是其他问题,这通常是一个好主意。

实际上,它看起来好像您正在使用默认LayoutManager的JFrame的内容窗格。 这将默认为BorderLayout 。 当你添加没有指定约束的组件时,它们将被添加到“中心”。 没有任何侧面组件,中心组件将展开以填充所有可用区域。

因此请设置合适的布局管理器。 我更喜欢创建一个JPanel并使用setContentPane ,而不必弯曲getContentPane代码结构。

Firstly, that is an awful lot of code. You want to be able to cut the problem down so that it is small enough that it becomes trivial. And if you want other people to help, it's generally a good idea to be able to produce a complete, compilable program that shows the problem and nothing else.

As it is, it looks as if you are using the content pane of a JFrame with the default LayoutManager. This will default to BorderLayout. When you add components without specifying constraints, they will be added to the "center". Without any side components, the center component will spread out to fill all available area.

So set an appropriate layout manager. I prefer to create a JPanel and use setContentPane, rather than have to bend my code structure around getContentPane.

更多推荐

本文发布于:2023-08-06 15:08:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1450380.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:元件   尺寸   size   Component   problem

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!