Как передать переменные / объекты из слушателя действия в класс драйвера? - PullRequest
1 голос
/ 21 февраля 2011

У меня есть те к классам: основной и графический интерфейс.В GUI есть actionListener, который собирает информацию из панели интерфейса пользователя.Как можно отправить эти переменные в класс драйвера, чтобы выполнить там все?Мне нужно добавить их в бесконечный цикл, чтобы нарисовать движущийся объект, методы рисования находятся в другом классе.GUI имеет расширенный фрейм

Вот классы:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends Frame implements WindowListener,ActionListener {
 JLabel name1  = new JLabel("Name");
 JLabel color1  = new JLabel("Color");
 JLabel diam1  = new JLabel("Diameter");
 JLabel dist1  = new JLabel("Distance");
 JLabel speed1  = new JLabel("Speed");
 JTextField name2 = new JTextField();
 JTextField color2  = new JTextField();
 JTextField diam2  = new JTextField();
 JTextField dist2  = new JTextField();
 JTextField speed2  = new JTextField();

public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
double distance;
int Speed;
double diameter;

public void actionPerformed(ActionEvent e) {
createVariables();
}
public void createVariables(){

try {
      distance = Double.parseDouble(dist2.getText());
      Speed = Integer.parseInt(speed2.getText());
      diameter = Double.parseDouble(diam2.getText());
    }
    catch(NumberFormatException i) {
    }   
    Planet cP = new        Planet(name2.getText(),distance,diameter,color2.getText(),Speed  );
    Main plnt = new Main(cP);
}

public void createFrame1(){
addWindowListener(this);
setLayout(new GridLayout(6,6,5,5));
JButton mygt = new JButton("Add planet");
mygt.addActionListener(this);
name2.setText("belekoks");color2.setText("RED");diam2.setText("30");dist2.setText(" 60");speed2.setText("2");
add(name1);add(name2);add(color1);add(color2);add(diam1);
add(diam2);add(dist1);add(dist2);add(speed1);add(speed2);
add(mygt);

}
public GUI(String title){
super(title);
createFrame1();
}
public void windowClosed(WindowEvent e) {}
public void windowActivated(WindowEvent arg0) {}
public void windowDeactivated(WindowEvent arg0) {}
public void windowDeiconified(WindowEvent arg0) {}
public void windowIconified(WindowEvent arg0) {}
public void windowOpened(WindowEvent arg0) {}
}

и Main:

import java.awt.event.ActionEvent;
import java.util.Random;
public class Main{
/**
 * @param args
 */

public Main(Planet name){
    super(name);
}

public static void main(String[] args) {
SolarSystem system = new SolarSystem(300, 300);
GUI p = new GUI("New Planet");
p.pack();
p.setVisible(true);
Sun sun = new Sun("Sun", 0, 90, "YELLOW", 0);
Planet venus = new Planet("Venus",70,15,"ORANGE",2);
Planet earth = new Planet("Earth",100,20,"BLUE",1);
Moon moon = new Moon("Moon",earth.dist,5,"GRAY", 1, 30, 3);
Moon[] moons = new Moon[100];
moons[0] = moon;
Planet[] planets = new Planet[100];
planets[0] = earth;
planets[1] = venus;
Random rG = new Random();
Asteroid[] asteroids = new Asteroid[100];
for(int i=0; i<100;i++){
    Asteroid Asteroids = new Asteroid("Asteroid",     rG.nextDouble()+rG.nextInt(10)+45,rG.nextDouble()+rG.nextInt(10),"DARK_GRAY",rG.nextInt(360        ), 1);
    asteroids[i]=Asteroids;
}   

/*LinkedList list = new LinkedList();
for (int i=0;i<1;i++){
    list.add(moons[i]);
}
for (int i=0;i<2;i++){
    list.add(planets[i]);
}
for (int i=0;i<100;i++){
    list.add(asteroids[i]);
}
for (int i=0;i<100;i++){
    list.add(sun);
}

for(int y=0;y<2;y++){
    planets[2].move();
    planets[2].drawOn(system);
    system.finishedDrawing();
}

    for (int i=0; i>=0; i++){
    sun.drawOn(system);

    for(int y=0;y<3;y++){
        planets[y].move();
        planets[y].drawOn(system);
    }

    for (int y=0; y<100; y++){
        asteroids[y].move();
        asteroids[y].drawOn(system);
    }
    for (int y=0; y<1; y++){
        moons[y].move();
        moons[y].drawOn(system);
    }

    system.finishedDrawing();
    }
*/
}
}

Я не ожидаю, что вы просматриваете весь код, ноглавное, что я получаю переменные в actionListener в графическом интерфейсе и хочу передать их в main, чтобы создать объект, который я мог бы нарисовать позже.

класс планеты создает объект:

public class Planet extends CosmicEntity {
public Planet(String name, double distance, double diameter, String col, int speed)    {
    super(name,distance,diameter,col,speed, 0);
}
}

и класс CosmicEntity, который содержит все переменные и методы для рисования планеты из переданных переменных (super (имя, расстояние, диаметр, столбец, скорость, 0)).

1 Ответ

1 голос
/ 21 февраля 2011

Трудно точно знать, что вам нужно, основываясь на предоставленной информации, но я думаю, что вы не хотите использовать бесконечный цикл, не для вашего GUI. Самые простые анимации могут легко управляться с помощью Swing Timer.

Что касается вашей другой проблемы, то общее правило состоит в том, что объекты могут вызывать методы других объектов, если они имеют действительную ссылку на другой объект. Как это сделать для вашего проекта, будет зависеть от вашего кода. Часто мы передаем ссылки одного объекта другому, хотя в качестве параметра метода или конструктора. Например,

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class FooMain {
   public static void main(String[] args) {
      FooNonGui nonGuiReference = new FooNonGui();
      FooGui fooGui = new FooGui(nonGuiReference);

      fooGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      fooGui.pack();
      fooGui.setLocationRelativeTo(null);
      fooGui.setVisible(true);

   }
}

class FooGui extends JFrame implements ActionListener {
   private FooNonGui nonGuiVariable;
   private int counter = 0;

   public FooGui(FooNonGui nonGuiParameter) {
      super("GUI");
      this.nonGuiVariable = nonGuiParameter;
      JButton button = new JButton("Button");
      button.addActionListener(this); // I hate doing this, but for brevity's sake...
      add(button);
   }

   public void actionPerformed(ActionEvent e) {
      nonGuiVariable.nonGuiMethod(counter);
      counter++;
   }
}

class FooNonGui {
   public void nonGuiMethod(int counter) {
      System.out.print("In non-GUI method.  ");
      System.out.println("counter is " + counter);
   }
}

Я предлагаю вам дать нам больше информации, чтобы мы могли лучше понять вашу проблему и оказать вам лучшую помощь. Эта ссылка может помочь: Умные вопросы

Редактировать A: К чему вы добавляете свои планеты? Объект SolarSystem? Какой бы класс он ни был, он, скорее всего, будет иметь или должен иметь публичный метод addPLanet (планета-планета). Если SolarSystem, то вы захотите передать ссылку на этот объект в ваш класс GUI, аналогичный тому, что я делал выше.

...