Это пользовательский интерфейс, который заставляет мяч падать по диагонали, но каждый раз, когда я нажимаю кнопку «Анимируй это!»он не создает новый шар.
Другая проблема заключается в том, что кнопка «заморозить» не работает должным образом, поскольку она должна остановить шары, а затем;если вы нажмете еще раз, это должно заставить шары снова двигаться.
Наконец, что-то не так с ограничениями, когда мяч почти касается дна, он не достигает егои подпрыгивает на правой стороне. Кроме того, когда шар «касается» правого предела, он просто поднимается.
Дополнительно, когда размер кадра изменяется, пределы не обновляются.
Пожалуйста, загрузите мяч и измените каталог, чтобы программа могла найти, где находится ваш мяч. Не обязательно скачивать футбольное поле, но если хотите, все в порядке. Наконец, я должен поблагодарить вас за то, что вы потратили время на поиск этой неисправности.
Ссылка на мяч: https://lapequeteria.cl/wp-content/uploads/2018/11/balon-adidas-2.jpeg (Make it png)
Ссылка на тональность: https://www.freejpg.com.ar/asset/900/9c/9ca2/F100004898.jpg
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import java.io.File;
class Animation extends JFrame { //Frame
static boolean running = true;
static Layout panel = new Layout();
JButton animate, stop;
Runnable runnable;
Thread move;
public Animation() {
setLayout(new BorderLayout()); //BorderLayout disposition
setTitle("Pelota en acción");
animate = new JButton("Animate it!"); //Button to create balls
animate.setSize(120,30);
animate.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
panel.createEllipse();
runnable = panel;
move = new Thread(runnable);
panel.X = 0;
panel.Y = 0;
move.start();
}
});
stop = new JButton("Freeze"); //Botón para interrumpir hilo (aun no implementado)
stop.setBounds(0,0,120,30);
stop.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(move.isAlive()){
stop.setText("Go"); //Pause
synchronized(move) {
try {
// running = false;
move.wait();
} catch (InterruptedException ex) {
System.out.println("Interrupted");
}
}
}
else {
stop.setText("Freeze"); //Play
synchronized(move) {
// running = true;
move.notifyAll();
}
}
}
});
JPanel subPanel = new JPanel(); //Layout with its buttons situated to the south
subPanel.add(animate);
subPanel.add(stop);
add(subPanel,BorderLayout.SOUTH);
add(panel);
}
public static void main(String[] args) { //Frame construction
Animation ventana = new Animation();
ventana.setSize(850,625);
ventana.setLocationRelativeTo(null);
ventana.setVisible(true);
ventana.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class Layout extends JPanel implements Runnable { //Layout and thread
volatile double X,Y; //Coordinates
volatile double dX=1,dY=1; //Direction
static ArrayList<Image> balls = new ArrayList<>(); //Balls collection
Image picture, ball;
int width = 120,height = 120;
@Override
public void paintComponent(Graphics g) { //Shows the ball and the pitch
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
soccerPitch();
g2.drawImage(picture, 0, 0, null);
for (Image ball : balls) { //Balls added to the layout
g2.drawImage(ball,(int)X,(int)Y,100,100,null);
}
}
public void soccerPitch () { //Builds the soccerPitch image
try {
picture = ImageIO.read(new File("C:\\Users\\Home\\Desktop\\NO BORRAR porfavor\\Cancha.jpg"));
} catch (IOException ex) {
System.out.println("Pitch image was not found");
}
}
public void createEllipse () { //Builds the ball image
try {
ball = ImageIO.read(new File("C:\\Users\\Home\\Desktop\\NO BORRAR porfavor\\Pelota.png"));
System.out.println(ball.getWidth(null)+" "+ball.getHeight(null));
} catch(IOException ex) {
System.out.println("Any balls were found");
}
balls.add(ball); //Balls are added to the collection
}
@Override
public void run () { //Moves the ball(coordinate system doesn't work)
moveBall(Animation.panel.getBounds());
}
public void moveBall(Rectangle2D limits) {
while(true) {
// while(Animation.running) {
System.out.println("X: "+X+"\tY: "+Y);
System.out.println(limits.getBounds());
X+=dX;
Y+=dY;
if(X<limits.getMinX()){
X=limits.getMinX();
dX=-dX;
}
if(X + width>=limits.getMaxX()){
X=limits.getMaxX()-width;
dX=-dY;
}
if(Y<limits.getMinY()){
Y=limits.getMinY();
dY=-dY;
}
if(Y + height>=limits.getMaxY()){
Y=limits.getMaxY()-height;
dY=-dY;
}
try {
Thread.sleep(4);
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
repaint();
}
}
}
На всякий случай, если вы хотите мне помочь;Я не спрашиваю о проделанной работе, просто объясните мне, почему она не работает.