Java 无法在线程中填充数组

Java 无法在线程中填充数组,java,multithreading,arrays,user-interface,event-listener,Java,Multithreading,Arrays,User Interface,Event Listener,这个gui应该在称为“系统”的框架面板上绘制运动图像。但首先我需要制作这些物体。在这里,我试图将它们添加到一个数组中,并在其他类中使用该数组。但数组一直是空的! 我想问题在于声明(代码的底部)。没有引发异常,因为我让其他类仅在该数组(天文馆)不为空时执行(它应该是这样工作的,因为其他移动取决于创建的行星(那些对象))。但如果它是空的,则表示没有声明任何内容。。。 如果要在事件侦听器中执行的线程中填充数组,应该怎么做 import javax.swing.*; import java.awt.*;

这个gui应该在称为“系统”的框架面板上绘制运动图像。但首先我需要制作这些物体。在这里,我试图将它们添加到一个数组中,并在其他类中使用该数组。但数组一直是空的! 我想问题在于声明(代码的底部)。没有引发异常,因为我让其他类仅在该数组(天文馆)不为空时执行(它应该是这样工作的,因为其他移动取决于创建的行星(那些对象))。但如果它是空的,则表示没有声明任何内容。。。 如果要在事件侦听器中执行的线程中填充数组,应该怎么做

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

public class GUI extends Frame implements WindowListener,ActionListener {
cpWindow window1 = new cpWindow();
cmWindow window2 = new cmWindow();
Delete window3 = new Delete();
SolarSystem system = new SolarSystem(300,300);
Planet[] Planetarium = null;        // using this to make an array
Moon[] Moonarium = null;
/**
 * Frame for general window.
 */
public void createFrame0(){
JFrame f0 = new JFrame("Choose what you want to do");
f0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f0.addWindowListener(this);
f0.setLayout(new GridLayout(3,1));
JButton cP = new JButton("Create a planet");
JButton cM = new JButton("Create a moon");
JButton Delete = new JButton("Annihilate a planet or moon");
f0.add(cP);
f0.add(cM);
f0.add(Delete);
cP.addActionListener(this);
cM.addActionListener(this);
Delete.addActionListener(this);
cP.setActionCommand("1");
cM.setActionCommand("2");
Delete.setActionCommand("3");
f0.pack();
f0.setVisible(true);
}
/**
 * Frame for planet adding window.
 */
class cpWindow implements ActionListener,WindowListener{
 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();
double distance;
int Speed;
double diameter;

public void createFrame1() {
    JFrame f1 = new JFrame("Add planet");
    f1.addWindowListener(this);
    f1.setLayout(new GridLayout(6,2,5,5));
    JButton mygt = new JButton("Create planet");
    mygt.addActionListener(this);
        name2.setText("belekoks");color2.setText("RED");diam2.setText("30");dist2.setText("60");spe    ed2.setText("2");
    f1.add(name1);f1.add(name2);f1.add(color1);f1.add(color2);f1.add(diam1);
    f1.add(diam2);f1.add(dist1);f1.add(dist2);f1.add(speed1);f1.add(speed2);
    f1.add(mygt);   
    f1.pack();
    f1.setVisible(true);
} 
public void createVariables(){
    try {
          distance = Double.parseDouble(dist2.getText());
          Speed = Integer.parseInt(speed2.getText());
          diameter = Double.parseDouble(diam2.getText());
        }
        catch(NumberFormatException i) {
        }
        Main.diametras = diameter;
        Main.distancija = distance;
        Main.greitis = Speed;
        Main.vardas = name2.getText();
        Main.spalva = color2.getText();
        }

public void actionPerformed(ActionEvent e) {
    createVariables();
    new NewThread().start();
            list.display();
}


public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
}
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) {}
}
/**
 * Frame for moon adding window
 */
CheckboxGroup planets = new CheckboxGroup();
String which;
class cmWindow implements ActionListener,WindowListener, ItemListener{  
 JLabel name1  = new JLabel("Name");
 JLabel color1  = new JLabel("Color");
 JLabel diam1  = new JLabel("Diameter");
 JLabel speed1  = new JLabel("Speed");
 JTextField name2 = new JTextField();
 JTextField color2  = new JTextField();
 JTextField diam2  = new JTextField();
 JTextField speed2  = new JTextField();
 JLabel info  = new JLabel("Which planet's moon it will be?");  
 JLabel corDist1  = new JLabel("Distance from centre of rotation");
 JLabel corSpeed1  = new JLabel("Speed which moon centres");
 JTextField corDist2  = new JTextField();
 JTextField corSpeed2  = new JTextField();

int cordistance;
int corspeed;

public void createFrame1() {
    JFrame f1 = new JFrame("Add moon");
    f1.addWindowListener(this);
    f1.setLayout(new GridLayout(8,2,5,5));
    JButton mygt = new JButton("Create moon");
    mygt.addActionListener(this);
    for(int i=0;i<Planetarium.length;i++){
        add(new Checkbox(Planetarium[i].nam,planets,false));
    }
    corDist2.setText("15");corSpeed2.setText("3");
    f1.add(name1);f1.add(name2);f1.add(color1);f1.add(color2);
    f1.add(diam1);f1.add(diam2);f1.add(speed1);f1.add(speed2);
    f1.add(corDist1);f1.add(corDist2);f1.add(corSpeed1);f1.add(corSpeed2);
    f1.add(mygt);   
    f1.pack();
    f1.setVisible(true);
}
int Speed;
double diameter;
public void createVariables(){
    try {
          Speed = Integer.parseInt(speed2.getText());
          diameter = Double.parseDouble(diam2.getText());
          cordistance = Integer.parseInt(corDist2.getText());
          corspeed = Integer.parseInt(corSpeed2.getText());
        }
        catch(NumberFormatException i) {}
        Main.diametras = diameter;
        Main.greitis = Speed;
        Main.vardas = name2.getText();
        Main.spalva = color2.getText();
        Main.centGrt = corspeed;
        Main.centAts = cordistance;

}
public void actionPerformed(ActionEvent e) {
    createVariables();
    new NewThread().start();
}   
public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
}
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) {}
@Override
public void itemStateChanged(ItemEvent e) {
    which = planets.getSelectedCheckbox().getLabel();   
}
}
/**
 * Deleting window
 */
class Delete implements ActionListener,WindowListener{
Checkbox[] checkB = new Checkbox[100];
public void createFrame2(){ 
JFrame f2 = new JFrame("Death Start");
f2.addWindowListener(this);
f2.setLayout(new GridLayout(6,2,5,5));
JButton Del = new JButton("Shoot it!");
Del.addActionListener(this);    
JLabel[] planetName  = new JLabel[100];
    for(int i=0;i<Planetarium.length;i++){
        planetName[i].setText(Planetarium[i].nam);
        checkB[i].setLabel("This");
        checkB[i].setState(false);
        f2.add(planetName[i]);f2.add(checkB[i]);
    }
}

public void actionPerformed(ActionEvent e) {
    for(int i=0;i<Planetarium.length;i++){
        if(checkB[i].getState()){
            Planetarium[i] = null;
        }
    }
}       

public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
}
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) {}
}
////////////////////////////////////////////////////////
public GUI() {
createFrame0();
}


public void actionPerformed(ActionEvent e) {
if ("1".equals(e.getActionCommand())) {this.window1.createFrame1();}
else if ("2".equals(e.getActionCommand()) & Planetarium != null)     {this.window2.createFrame1();} 
else if ("3".equals(e.getActionCommand()) & Planetarium != null)     {this.window3.createFrame2();}
}

public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
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) {}
LinkedList list = new LinkedList();
class NewThread extends Thread {
Thread t;
NewThread() {
  t = new Thread(this);
  t.start(); 
}
public void run() {
    Moon moon = null;
    Planet planet = new     Planet(Main.vardas,Main.distancija,Main.diametras,Main.spalva,Main.greitis);
    if(Planetarium != null){
    for(int i=0;i<Planetarium.length;i++){
        if (which == Planetarium[i].nam){
            moon = new Moon(Main.vardas,Planetarium[i].dist,Main.diametras,Main.spalva,Main.greitis,Main.centGrt,Main.centAts);
        }
    }}
    int a=0,b=0;
    int i = 0;

        if (Main.centAts == 0){
            Planetarium[i] = planet;            //i guess     problem is here
            a++;
                            list.add(planet);
            for(i=0; i <= i+1 0; i++) {
                planet.move();
                planet.drawOn(system);
                system.finishedDrawing();
                                    if (i==360){i=0;}
            }
        }
        else{
            Moonarium[i] = moon;
            b++;
          if(i==Main.greitis){
            for(int l = 0; l <= l+1; l++) {
                moon.move();
                moon.drawOn(system);
                system.finishedDrawing();
            }}
        } 

}
  }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类GUI扩展框架实现WindowListener、ActionListener{
cpWindow window1=新cpWindow();
cmWindow window2=新的cmWindow();
Delete window3=新建Delete();
SolarSystem=新的SolarSystem(300300);
Planet[]Planetarium=null;//使用它创建数组
Moon[]Moonarium=null;
/**
*一般窗口的框架。
*/
public void createFrame0(){
JFrame f0=新JFrame(“选择您想要做的事情”);
f0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f0.addWindowListener(此);
f0.设置布局(新网格布局(3,1));
JButton cP=新JButton(“创建行星”);
JButton cM=新JButton(“创建月亮”);
JButton Delete=新JButton(“消灭行星或月球”);
f0.add(cP);
f0.添加(cM);
f0.增加(删除);
cP.addActionListener(本);
cM.addActionListener(本);
Delete.addActionListener(这个);
cP.setActionCommand(“1”);
cM.setActionCommand(“2”);
删除.setActionCommand(“3”);
f0.pack();
f0.设置可见(真);
}
/**
*行星添加窗口的框架。
*/
类cpWindow实现ActionListener,WindowListener{
JLabel Name 1=新的JLabel(“名称”);
JLabel color1=新的JLabel(“颜色”);
JLabel diam1=新JLabel(“直径”);
JLabel dist1=新JLabel(“距离”);
JLabel speed1=新JLabel(“速度”);
JTextField name 2=新的JTextField();
JTextField color2=新的JTextField();
JTextField diam2=新的JTextField();
JTextField dist2=新的JTextField();
JTextField speed2=新的JTextField();
双倍距离;
整数速度;
双倍直径;
public void createFrame1(){
JFrame f1=新JFrame(“添加行星”);
f1.addWindowListener(此);
f1.设置布局(新网格布局(6,2,5,5));
JButton mygt=新JButton(“创建行星”);
mygt.addActionListener(此);
名称2.setText(“belekoks”);颜色2.setText(“红色”);直径2.setText(“30”);距离2.setText(“60”);spe ed2.setText(“2”);
f1.add(名称1);f1.add(名称2);f1.add(颜色1);f1.add(颜色2);f1.add(直径1);
f1.add(直径2);f1.add(距离1);f1.add(距离2);f1.add(速度1);f1.add(速度2);
f1.添加(mygt);
f1.pack();
f1.setVisible(真);
} 
public void createVariables(){
试一试{
distance=Double.parseDouble(dist2.getText());
Speed=Integer.parseInt(speed2.getText());
diameter=Double.parseDouble(diam2.getText());
}
捕获(编号格式异常i){
}
主直径=直径;
Main.distanceja=距离;
Main.greitis=速度;
Main.vardas=name2.getText();
Main.spalva=color2.getText();
}
已执行的公共无效操作(操作事件e){
createVariables();
新的NewThread().start();
list.display();
}
公共无效窗口关闭(WindowEvent e){
处置();
系统出口(0);
}
公共无效windowClosed(WindowEvent e){}
公共无效windowActivated(WindowEvent arg0){}
public void windowDeactivated(WindowEvent arg0){}
公共无效WindowDeConified(WindowEvent arg0){}
公共无效WindowIconnified(WindowEvent arg0){}
已打开公共无效窗口(WindowEvent arg0){}
}
/**
*加窗框
*/
CheckboxGroup行星=新的CheckboxGroup();
其中字符串;
类cmWindow实现ActionListener、WindowListener、ItemListener{
JLabel Name 1=新的JLabel(“名称”);
JLabel color1=新的JLabel(“颜色”);
JLabel diam1=新JLabel(“直径”);
JLabel speed1=新JLabel(“速度”);
JTextField name 2=新的JTextField();
JTextField color2=新的JTextField();
JTextField diam2=新的JTextField();
JTextField speed2=新的JTextField();
JLabel info=新的JLabel(“它将是哪颗行星的卫星?”);
JLabel corDist1=新JLabel(“距旋转中心的距离”);
JLabel corSpeed1=新JLabel(“月球中心的速度”);
JTextField corDist2=新的JTextField();
JTextField corSpeed2=新的JTextField();
友好的态度;
国际速度;
public void createFrame1(){
JFrame f1=新JFrame(“添加月亮”);
f1.addWindowListener(此);
f1.设置布局(新网格布局(8,2,5,5));
JButton mygt=新JButton(“创建月亮”);
mygt.addActionListener(此);

对于(int i=0;i您似乎没有为这些数组分配任何内容,因此它们应该是
null
而不是空的。 您使用它们的方式可能会更好

final List<Planet> planetarium = new ArrayList<Planet>();

planetarium.add(new Planet( .... ));

Planet p = planetarium.get(i);

for(Planet p: planetarium){
  // something for each planet.
}
final List planetarium=new ArrayList();
天文馆。添加(新行星(…);
行星p=天文馆。获取(i);
行星p:天文馆{
//每个星球都有。
}

注意:在使用数组之前,您必须先创建一个数组,并且您知道它的长度是固定的。列表可以有任何长度,但您仍然需要先创建它。

在使用之前查看循环:

 Planetarium[i] = planet; 
看起来它会无限循环

for(i=0; i >= 0; i++) 

i
将始终>=0。

是的,在窗格中移动对象时需要它=]但这不是related@Medardas这是相关的,因为如果代码永远停留在这个循环中,它将永远不会到达下一个应该向天文馆添加内容的部分。首先,没有人注意到我正在尝试在infi之后做一些事情nite循环。然而,我已经将声明移动到无限循环前面,并尝试将对象添加到链接列表中,但在尝试显示它之后,什么都没有发生……我仍然希望我建议的方法有效。我建议您再次阅读我的答案。当您尝试