Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向数组中添加新元素时遇到问题_Java_Arrays_User Interface - Fatal编程技术网

Java 向数组中添加新元素时遇到问题

Java 向数组中添加新元素时遇到问题,java,arrays,user-interface,Java,Arrays,User Interface,我想将输入到textfields中的字符串转换为数组的新元素,但每当我试图打印它们时,它们仍然注册为null。如果你可以试着忽略与问题无关的东西,因为我正在试验它们,但我不能向数组中添加新元素 这是创建和初始化阵列的地方 public class AssignSeat { String[] arrangement = new String[12]; public String[] SeatStart() { arrangement[0] = "Collins"; arran

我想将输入到textfields中的字符串转换为数组的新元素,但每当我试图打印它们时,它们仍然注册为null。如果你可以试着忽略与问题无关的东西,因为我正在试验它们,但我不能向数组中添加新元素

这是创建和初始化阵列的地方

public class AssignSeat {

String[] arrangement = new String[12];

public String[] SeatStart() {

    arrangement[0] = "Collins";
    arrangement[2] = "Faivre";
    arrangement[3] = "Kinnard";
    arrangement[6] = "Morgans";
    arrangement[7] = "Rohan";
    arrangement[8] = "Shatrov";
    arrangement[9] = "Sword";
    arrangement[11] = "Tuckness";

    System.out.format("%-15s%-15s%n", "seat", "passenger");

    for (int i=0; i<arrangement.length; i++) {
        System.out.format("%-15s%-15s%n", i+1, arrangement[i]);

    }
    System.out.println();
    return arrangement;

}


public String[] getArrangement() {
    return arrangement;
}

public void setArrangement(String[] arrangement) {
    this.arrangement = arrangement;
}
}

从您的代码来看,我认为您对Java和编程是相当陌生的

请看一看阵列的工作原理

现在,对于您的代码,正如Dheeraj所说,每次单击按钮,然后调用
SeatStart()
时,您都在创建一个新的
seat
对象。这意味着您对阵列所做的每一次更改都将付诸东流。您可能看不到这一点,因为在GUI中,您没有检查数组的值来填充显示座位的内容。因此,您只保留最后一次更改

将打印代码移动到一个新的私有方法中,如
printary()
,这样您就可以在
SeatStart()调用它,并且当您进行更改时,就不必在其他地方再次编写相同的代码

你有重复的代码做同样的事情。把它放在同一个地方,通过改变一个变量,你可以得到同样的效果。这使您的代码更清晰,更易于维护。如果你想要更灵活的东西,你可以用if或是一段时间

我将试着给你一个概述。首先,不在动作侦听器中实例化
座椅
,而是在加载帧时实例化。动作监听器与您单击的按钮有关,因此它在那里没有意义

public void actionPerformed(ActionEvent event) {
if(event.getSource() instanceof JButton){

    JButton clickedButton = (JButton) event.getSource();
    String buttonText = clickedButton.getText();

    if (buttonText.equals("2") || buttonText.equals("5") || buttonText.equals("6") || buttonText.equals("11")){
        int seatNum = Integer.parseInt(buttonText);     // you get the seat number into an integer.
                                                        //this only works if the text is actually representing a number
        entername.setVisible(true);
        seatnum.setVisible(true);
        confirmed.setVisible(true);
        inputline.setVisible(true);
        outputline.setVisible(true);
        inputline.setEditable(true);
        inputline.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();   // don't put code between this and if. 
                                            //No point doing something if the key is not enter

                if (key == KeyEvent.VK_ENTER) {             
                    Toolkit.getDefaultToolkit().beep();
                    String name = inputline.getText();
                    seat.arrangement[seatNum - 1] = name;
                    System.out.println(seat.arrangement[seatNum - 1]);
                    inputline.setEditable(false);
                    outputline.setText(buttonText);
                    clickedButton.setForeground(Color.black); // I'm guessing this is the button that got clicked?
                    for( ActionListener al : clickedButton.getActionListeners() ) {
                         clickedButton.removeActionListener( al );
                    }                           
                }
            }
        });
    }
}
}
当然,这只是一种方法,有很多方法可以做到这一点。试着让员工留在他们该去的地方。例如,那些setVisible实际上不属于按钮的动作侦听器。你可以把他们转移到另一种方法,等等。你得到了这个想法

希望我能帮点忙:)


编辑1。我刚刚又看了一遍你的代码。您使用enter的KeyListener试图实现什么?最好在创建所需组件的位置添加KeyListener,而不是在另一个actionListener中。这将是非常糟糕的调试。

在排序中,您想要的是。。。你想更新已经有一些数据的字符串数组吗?想让其他人看到吗?为什么要在每个if-else循环中创建新对象?创建新对象并不意味着您正在处理单个副本。这意味着您正在处理多个副本。new关键字将创建一个新对象。如果你想使用同一个对象,那么你需要创建一次对象,然后使用它并使用singleton。看起来在执行某些操作时,即使你再次添加一个键侦听器,这有什么用途?你是指数组对象吗?我不完全明白。
public void actionPerformed(ActionEvent event) {
if(event.getSource() instanceof JButton){

    JButton clickedButton = (JButton) event.getSource();
    String buttonText = clickedButton.getText();

    if (buttonText.equals("2") || buttonText.equals("5") || buttonText.equals("6") || buttonText.equals("11")){
        int seatNum = Integer.parseInt(buttonText);     // you get the seat number into an integer.
                                                        //this only works if the text is actually representing a number
        entername.setVisible(true);
        seatnum.setVisible(true);
        confirmed.setVisible(true);
        inputline.setVisible(true);
        outputline.setVisible(true);
        inputline.setEditable(true);
        inputline.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();   // don't put code between this and if. 
                                            //No point doing something if the key is not enter

                if (key == KeyEvent.VK_ENTER) {             
                    Toolkit.getDefaultToolkit().beep();
                    String name = inputline.getText();
                    seat.arrangement[seatNum - 1] = name;
                    System.out.println(seat.arrangement[seatNum - 1]);
                    inputline.setEditable(false);
                    outputline.setText(buttonText);
                    clickedButton.setForeground(Color.black); // I'm guessing this is the button that got clicked?
                    for( ActionListener al : clickedButton.getActionListeners() ) {
                         clickedButton.removeActionListener( al );
                    }                           
                }
            }
        });
    }
}
}