John
John

Reputation: 59

Help with creating a complex Swing GUI with animation

This is my first non-school related program. I have a few questions that you guys can hopefully answer with ease. I have 3 questions. How can I add my button to my JFrame even though it's in a different class than the button?

Also, how would I go about making my shape and ten others like it about a quarter second after each other so I had a line of them.

Then, how would I force them to follow a predetermined path that scales to somebody dragging the box around?

Thanks a lot for reading and helping me out guys. Here are my three classes:

gameRunner.java

import javax.swing.JFrame;

public class gameRunner {
public static void main(String args []){
    Enemy e = new Enemy();
    Buttons b = new Buttons();
    JFrame f = new JFrame();
    f.add(b);
    f.add(e);
    f.setVisible(true);
    f.setSize(1300, 700);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setTitle("Tower Defense");
}
}

Enemy.java

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Enemy extends JPanel implements ActionListener {

    Timer t = new Timer(5, this);

    double x = 0;
    double y = 0;
    double velX = 3;
    double velY = .5;

    int health = 10;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D square = new Rectangle2D.Double(x, y, 10, 10);
        g2.fill(square);
        t.start();
    }

    public double adjustHorizontalSpeed() {
        y += velY;
        return y;
    }

    public double adjustVerticalSpeed() {
        x += velX;
        return x;
    }

    public void actionPerformed(ActionEvent e) {
        adjustHorizontalSpeed();
        adjustVerticalSpeed();
        repaint();
    }

}

Buttons.java

import java.awt.*;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Buttons extends JFrame implements ActionListener{

    private JButton shoot;


public Buttons(){
    shoot = new JButton("Shoot!");
    shoot.setBounds(50,60,50,100);
    shoot.addActionListener(this);
}


@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}
}

Upvotes: 2

Views: 602

Answers (2)

Lincoded
Lincoded

Reputation: 425

For the predetermined path, you should probably have them move/size themselves proportional to the containing pane. With a layout manager, assuming they are inside their own JPanel, the pane should scale automatically, so when the window is resized, the shapes will resize and move properly.

Upvotes: 0

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285430

Buttons shouldn't extend JFrame if all you want to do is use it to create a JButton that you wish to add to another GUI. Instead perhaps give it a public method called getShoot() that returns the button created:

   public JButton getShoot() {
      return shoot;
   }

Next, to do things in a timed fashion, you should use a Swing Timer. The tutorials will tell you how to do this: How to use Swing Timers

Next, you'll want to read the Swing tutorial section on how to use layout managers so you can add a complex mix of components to the GUI and have them all fit well together: Laying out Components in a Container

Finally, as for this:

Then, how would I force them to follow a predetermined path that scales to somebody dragging the box around?

You'll have to describe this better for me to understand what you're trying to do.

Upvotes: 1

Related Questions