[РЕДАКТИРОВАТЬ] Хорошо, благодаря Malte Kölle, вычисление 'c' останавливается после его удаления.Есть еще проблема с тем, что «с» нет в прессе, но я заметил еще одну проблему.Переменные скорости 'sw' и 'sh' складываются, если кнопка вызова появляется повторно, и я не знаю, как этого избежать.Я не могу установить переменные скорости равными нулю, потому что это внутри внутреннего класса.Я обновил код.
Я решил создать простую игру с кнопками в java, используя AWT, где в центре есть кнопка «b», которая порождает другую кнопку «c», которая перемещается по экрану.Когда нажата кнопка «c», она удаляется.'c' движется нормально, но у меня две проблемы.
- Часто нажатие на 'c' показывает нажатую анимацию, но затем продолжает существовать.Как заставить его запускать свой actionListener при нажатии, а не при нажатии?
- Когда щелкают и удаляют 'c', вычисления для его движения все еще выполняются, даже если он не существует.Я понятия не имею, как это исправить.
Доп.После того, как эти проблемы будут устранены, следующим шагом будет создание нескольких кнопок с одинаковыми атрибутами.Если у кого-то есть предложения по этому поводу, они будут признательны, но не обязательно.
У меня есть довольно много системных выходов для обнаружения подобных проблем, поэтому я знал, что это все еще вычисляется.Это мой первый проект кода, поэтому, если есть какие-либо другие способы его улучшения, пожалуйста, дайте мне знать.Спасибо!
public class Main {
Frame f = new Frame("Button Game");
Button b = new Button("Spawn Button");
Button c = new Button("Click Me!");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
int fh = f.getHeight();
int fw = f.getWidth();
boolean cExists;
Main () {
f.setSize(screenWidth/2,screenHeight/2); //Sets frame size
f.setLocation(screenWidth/4,screenHeight/4); //Sets frame location
f.setLayout(null); //Sets layout manager
f.setVisible(true); //Sets frame to be visible
System.out.println("Frame height:" + f.getHeight());
System.out.println("Frame width:" + f.getWidth());
fh = f.getHeight() + 20;
fw = f.getWidth();
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.out.println("Window closed by window listener");
f.dispose();
System.exit(1);
}
});
f.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
super.componentResized(e);
fw = f.getWidth();
fh = f.getHeight();
System.out.println("Frame size changed to " + f.getSize());
b.setBounds(fw/2 - 60,fh/2 - 15, 120, 30);
System.out.println("Button 'b' re-centered to " + b.getLocation());
if (fw <= 320 || fh <= 180) {
f.setSize(320,180);
}
}
});
f.add(b);
b.setBounds(fw/2 - 60,fh/2 - 15, 120, 30);
System.out.println("Button 'f' spawned at " + b.getLocation());
b.setVisible(true);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int rn1 = ThreadLocalRandom.current().nextInt(30, fw - 130);
int rn2 = ThreadLocalRandom.current().nextInt(50, fh - 60);
f.add(c);
cExists = true;
c.setBounds(rn1, rn2, 100, 30);
System.out.println("Button 'c' created at " + c.getLocation());
int sh = ThreadLocalRandom.current().nextInt(-5, 10);
int sw = ThreadLocalRandom.current().nextInt(-5, 10);
System.out.println("Speed vertical: " + sh);
System.out.println("Speed horizontal: " + sw);
Timer timer = new Timer();
class remindTask extends TimerTask {
public void run() {
if (cExists) {
c.setBounds(c.getX() + sw, c.getY() + sh, 100, 30);
System.out.println("Button 'c' moved to " + c.getLocation());
if (c.getX() >= fw-130) {
c.setBounds(30 + sw, c.getY() + sh, 100, 30);
} else if (c.getY() >= fh-60) {
c.setBounds(c.getX() + sw, 30 + sh, 100, 30);
} else if (c.getX() <= 30) {
c.setBounds(fw - 130 + sw, c.getY() + sh, 100, 30);
} else if (c.getY() <= 30) {
c.setBounds(c.getX() + sw, fh - 15 + sh, 100, 30);
}
} else {
timer.cancel();
//sw = 0; cant because it is inside an internal class. Maybe outsource to a method?
//sh = 0; Error:(94, 33) java: local variables referenced from an inner class must be final or effectively final
}
}
}
timer.schedule(new remindTask(), 0, 100);
}
});
c.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
f.remove(c);
cExists = false;
System.out.println("'cExists' set to false");
System.out.println("Removed button 'c' at " + c.getLocation());
}
});
}
public static void main(String[] args) { //Calls code
System.out.println("Code beginning"); //Logs beginning of runtime
try { //Runs Main through run
Main f = new Main();
f.run(args);
}
catch (Exception e){ //NOT SURE
e.printStackTrace();
}
}
public void run (String[] args) throws Exception{ //New method to call non-static things
System.out.println("Frame created");
}