这是我的代码。我想将球弹回的框的大小设置为窗口大小,即使用户调整窗口大小,例如恢复窗口或将其拖动到一个大小。 非常感谢。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
* One ball bouncing inside a rectangular box.
* All codes in one file. Poor design!
*/
// Extends JPanel, so as to override the paintComponent() for custom rendering codes.
public class BouncingBallSimple extends JPanel {
// Container box's width and height
private final int BOX_WIDTH = 700;
private final int BOX_HEIGHT = 700;
// Ball's properties
private float ballRadius = 15; // Ball's radius
private float ballX = ballRadius + 50; // Ball's center (x, y)
private float ballY = ballRadius + 20;
private float ballSpeedX = 60; // Ball's speed for x and y
private float ballSpeedY = 60;
private static final int UPDATE_RATE = 30; // Number of refresh per second
/** Constructor to create the UI components and init game objects. */
public BouncingBallSimple() {
this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT));
// Start the ball bouncing (in its own thread)
Thread gameThread;
gameThread = new Thread() {
@Override
public void run() {
while (true) { // Execute one update step
// Calculate the ball's new position
ballX += ballSpeedX;
ballY += ballSpeedY;
// Check if the ball moves over the bounds
// If so, adjust the position and speed.
if (ballX - ballRadius < 0) {
ballSpeedX = -ballSpeedX; // Reflect along normal
ballX = ballRadius; // Re-position the ball at the edge
} else if (ballX + ballRadius > BOX_WIDTH) {
ballSpeedX = -ballSpeedX;
ballX = BOX_WIDTH - ballRadius;
}
// May cross both x and y bounds
if (ballY - ballRadius < 0) {
ballSpeedY = -ballSpeedY;
ballY = ballRadius;
} else if (ballY + ballRadius > BOX_HEIGHT) {
ballSpeedY = -ballSpeedY;
ballY = BOX_HEIGHT - ballRadius;
}
// Refresh the display
repaint(); // Callback paintComponent()
// Delay for timing control and give other threads a chance
try {
Thread.sleep(1000 / UPDATE_RATE); // milliseconds
} catch (InterruptedException ex) { }
}
}
};
gameThread.start(); // Callback run()
}
/** Custom rendering codes for drawing the JPanel */
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // Paint background
// Draw the box
g.setColor(Color.CYAN);
g.fillRect(0, 0, getWidth(), getHeight());
// Draw the ball
g.setColor(Color.BLUE);
g.fillOval((int) (ballX - ballRadius), (int) (ballY - ballRadius),
(int)(2 * ballRadius), (int)(2 * ballRadius));
Graphics2D comp2D = (Graphics2D) g;
comp2D.drawRect(0, 645, 1365, 100);
comp2D.setColor(Color.GREEN);
comp2D.fillRect(0, 645, 1365, 100);
Graphics2D stand = (Graphics2D) g;
stand.setColor(Color.BLACK);
stand.fillRect(80, 575, 30, 70);
Graphics2D sling = (Graphics2D) g;
sling.drawArc(15, 570, 90, 50, 50, 250);
}
/** main program (entry point) */
public static void main(String[] args) {
// Run GUI in the Event Dispatcher Thread (EDT) instead of main thread.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Set up main window (using Swing's Jframe)
JFrame frame = new JFrame("Angry Birds for Annie May Tion");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new BouncingBallSimple());
frame.pack();
frame.setVisible(true);
}
});
}
}
答案 0 :(得分:2)
this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT));
BOX_WIDTH
,请将其替换为getWidth()
BOX_HEIGHT
,请将其替换为getHeight()
这应该可以解决问题。
答案 1 :(得分:0)
它应该像在构造函数中删除对this.setPreferredSize()
的调用一样简单。调整窗口大小时,它将请求面板调整自身大小。在你的绘图程序中,你得到了面板的当前界限并在它们之间反弹,所以它应该可以正常工作。
在不相关的说明中:您应该用javax.swing.Timer替换aameThread
。实际上,你是从事件调度线程外部调用绘制请求,这是一个坏主意。
答案 2 :(得分:0)
这里没有简单的答案,因为你有硬编码的x,y,w,h值。不那么简单的答案是使用变量而不是硬编码值,并在paintComponent()方法中动态调整这些值。