4

これは私のコードです。ウィンドウを復元したり、サイズにドラッグしたりするなど、ユーザーがウィンドウのサイズを変更した場合でも、ボールが跳ね返るボックスのサイズをウィンドウサイズのサイズに設定したいと思います。どうもありがとう。

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);
     }
  });
 }
 }
4

3 に答える 3

2
  1. 次の行をドロップします。this.setPreferredSize(new Dimension(BOX_WIDTH, BOX_HEIGHT));
  2. 使用した場所はどこでもBOX_WIDTH置き換えますgetWidth()
  3. 使用した場所はどこでもBOX_HEIGHT置き換えますgetHeight()

これでうまくいくはずです。

于 2013-03-08T18:22:58.530 に答える
0

コンストラクターでの呼び出しを削除するのと同じくらい簡単なはずthis.setPreferredSize()です。ウィンドウのサイズが変更されると、パネル自体のサイズを変更するように要求されます。ペイント ルーチンでは、パネルの現在の境界を取得し、それらの間をバウンスしているので、問題なく動作するはずです。

無関係なメモ: javax.swing.TimeraameThreadに置き換える必要があります。そのままでは、イベント ディスパッチ スレッドの外部からペイント リクエストを呼び出していますが、これは悪い考えです。

于 2013-03-08T18:10:45.253 に答える
0

x、y、w、h の値がハードコードされているため、簡単な答えはありません。それほど単純ではない答えは、ハードコードされた値の代わりに変数を使用し、それらの値を paintComponent() メソッド内で動的に調整することです。

于 2013-03-08T18:15:14.097 に答える