Java事件侦听器代码未按预期运行(初学者)

Java事件侦听器代码未按预期运行(初学者),java,swing,event-handling,windowlistener,Java,Swing,Event Handling,Windowlistener,因此,我现在更新了代码:但它仍然没有将字符串设置为输入 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Funclass extends JFrame implements WindowListener { FlowLayout layout = new FlowLayout(); String[] Skillz

因此,我现在更新了代码:但它仍然没有将字符串设置为输入

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

public class Funclass extends JFrame implements WindowListener {

    FlowLayout layout = new FlowLayout();
    String[] Skillz = {"Analytical", "Numerical", "Leadership",
        "Communication", "Organisation", "Interpersonal"};
    String[] ROLEZ = {"Developer", "Sales", "Marketing", "Consultant"};
    String[] Industries = {"Consulting", "Tech"};
    public String R1, R2, R3, R4, RETURNROLE,
        RETURNTYPE, RETURNLIST, RETURNCOMPANY;
    JTextField Company = new JTextField("Company Name");
    JComboBox TYPE = new JComboBox(Industries);
    JList Skills = new JList(Skillz);
    JComboBox ROLE = new JComboBox(ROLEZ);
    JButton Submit = new JButton("Submit");

    public Funclass() {
        super("Input Interface");
        setLayout(layout);

        Skills.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        add(Company);
        add(TYPE);
        add(ROLE);
        add(Skills);

        Company.addActionListener(
            new ActionListener() {

                public void actionPerformed(ActionEvent event) {
                    if (event.getSource() == Company);
                    RETURNCOMPANY = event.getActionCommand();
                }
            });

        Skills.addListSelectionListener(
            new ListSelectionListener() {

                public void valueChanged(ListSelectionEvent event) {
                    RETURNLIST = (String) Skills.getSelectedValue();

                }
            });

        TYPE.addItemListener(
            new ItemListener() {

                public void itemStateChanged(ItemEvent event) {
                    if (event.getStateChange() == ItemEvent.SELECTED) {
                        RETURNTYPE = Industries[TYPE.getSelectedIndex()];
                    }
                }
            });

        ROLE.addItemListener(
            new ItemListener() {

                public void itemStateChanged(ItemEvent event) {
                    if (event.getStateChange() == ItemEvent.SELECTED) {
                        RETURNROLE = ROLEZ[ROLE.getSelectedIndex()];
                    }
                }
            });
    }

    public void windowClosed(WindowEvent e) {
        CreateCoverLetter creatorObject = new CreateCoverLetter();
        creatorObject.openFile();
        creatorObject.addBody(RETURNCOMPANY, RETURNROLE, RETURNLIST);
        creatorObject.closeFile();
        System.out.println(RETURNCOMPANY);
    }

    public void windowDeiconified(WindowEvent e) {}

    public void windowActivated(WindowEvent e) {}

    public void windowClosing(WindowEvent e) {}

    public void windowDe(WindowEvent e) {}

    public void windowIconified(WindowEvent e) {}

    public void windowDeactivated(WindowEvent e) {}

    public void windowOpened(WindowEvent e) {}
}
我是一个完全的初学者,我试图构建一个简单的程序,从一个基本的GUI获取用户输入并使用它们创建一个文件。出于某种原因,当我运行此程序时,代码会执行,但字符串变量
RETURNROLE
RETURNLIST
RETURNCOMPANY
没有设置为用户输入的值。有人能解释为什么吗

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

public class Funclass extends JFrame{
FlowLayout layout = new FlowLayout();
String[] Skillz = {"Analytical", "Numerical", "Leadership", "Communication",         "Organisation", "Interpersonal"};
String[] ROLEZ = {"Developer", "Sales", "Marketing", "Consultant"};
String[] Industries = {"Consulting", "Tech"};
public String R1, R2, R3, R4, RETURNROLE, RETURNTYPE, RETURNLIST, RETURNCOMPANY;
JTextField Company = new JTextField("Company Name");
JComboBox TYPE = new JComboBox(Industries);
JList Skills = new JList(Skillz);
JComboBox ROLE = new JComboBox(ROLEZ);
public Funclass(){
    super("Input Interface");
    setLayout(layout);

    Skills.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    add(Company);
    add(TYPE);
    add(ROLE);
    add(Skills);

    Company.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                    if(event.getSource()==Company);
                    RETURNCOMPANY = event.getActionCommand();
                }
            }

            );


    Skills.addListSelectionListener(
            new ListSelectionListener(){
                public void valueChanged(ListSelectionEvent event){
                    RETURNLIST = (String) Skills.getSelectedValue();

                }
            });


    TYPE.addItemListener(
            new ItemListener(){
                public void itemStateChanged(ItemEvent event){
                    if(event.getStateChange()==ItemEvent.SELECTED)
                        RETURNTYPE = Industries[TYPE.getSelectedIndex()];
                        }
            }
    );


    ROLE.addItemListener(
            new ItemListener(){
            public void itemStateChanged(ItemEvent event){
            if(event.getStateChange()==ItemEvent.SELECTED)
            RETURNROLE = ROLEZ[ROLE.getSelectedIndex()];
            }
            }
            );

    CreateCoverLetter creatorObject = new CreateCoverLetter();
    creatorObject.openFile();
    creatorObject.addBody(RETURNCOMPANY, RETURNROLE, RETURNLIST);
    creatorObject.closeFile();
    System.out.println(RETURNCOMPANY);
}

}   

您正在类的构造函数中创建输出文件,因此该文件是在用户有机会填写或选择任何值之前创建的


我会添加一个Submit按钮或其他东西,然后让它提取UI元素的内容并创建文件。您不需要所有不同的侦听器,因为您可以在提交按钮上读取ActionEvent时的值

您正在类的构造函数中创建输出文件,因此该文件是在用户有机会填写或选择任何值之前创建的


我会添加一个Submit按钮或其他东西,然后让它提取UI元素的内容并创建文件。您不需要所有不同的侦听器,因为您可以在提交按钮上读取ActionEvent时的值

之所以会发生这种情况,是因为您正在构造函数中写入文件,在定义侦听器之后,在触发任何将为这些变量赋值的事件之前

例如,您可以在用户关闭窗口时写入文件,方法是让类实现
WindowListener
,然后实现
windowClosed
事件:

public class Funclass extends JFrame implements WindowListener { 

  // ...

  public void windowClosed(WindowEvent e) {
    CreateCoverLetter creatorObject = new CreateCoverLetter();
    creatorObject.openFile();
    creatorObject.addBody(RETURNCOMPANY, RETURNROLE, RETURNLIST);
    creatorObject.closeFile();
    System.out.println(RETURNCOMPANY);
  }
}

发生这种情况的原因是,在定义监听器之后,在触发任何将为这些变量赋值的事件之前,您正在构造函数中写入文件

例如,您可以在用户关闭窗口时写入文件,方法是让类实现
WindowListener
,然后实现
windowClosed
事件:

public class Funclass extends JFrame implements WindowListener { 

  // ...

  public void windowClosed(WindowEvent e) {
    CreateCoverLetter creatorObject = new CreateCoverLetter();
    creatorObject.openFile();
    creatorObject.addBody(RETURNCOMPANY, RETURNROLE, RETURNLIST);
    creatorObject.closeFile();
    System.out.println(RETURNCOMPANY);
  }
}

添加了
Company
ActionListener()

如果您想监听到的某些更改

JTextField Company = new JTextField("Company Name");

然后您必须实现,示例

添加了
Company
的一些错误
ActionListener()

如果您想监听到的某些更改

JTextField Company = new JTextField("Company Name");

然后,您必须执行示例

您是否确定事件正在发生?如果这些事件没有发生,那么这些变量中就永远不会有您希望了解的值。在java中,ALCAP通常指示常量值,这使得代码看起来很奇怪。考虑使用“代替代码”>实现Windows WistList< <代码>。您确定事件是否正在发生?如果这些事件没有发生,那么这些变量中就永远不会有您希望了解的值。ALCAP通常在java中指示常量值,这使得代码看起来很奇怪。考虑使用“代替代码”>实现Windows WisteleNo//Cux.@ Ravin:这个答案(1 +)给出了事件驱动编程的本质。对于这种类型的程序,您不能以线性方式思考,而必须对事件做出响应。@Ravin:这个答案(1+)为您提供了事件驱动编程的本质。对于这种类型的程序,您不能以线性方式思考,但必须响应事件。如果我这样做,我是否必须在主方法中调用windowCLosed方法,如果是,我应该传递什么参数?如果这样做,您将在窗口关闭后立即写入文件,即。,关闭窗口时会自动调用该方法。如果这样做,我是否必须在主方法中调用windowCLosed方法,如果是,我应该传递什么参数?如果这样做,您将在窗口关闭后立即写入文件,即关闭窗口时会自动调用该方法。