如何从action listener/类构造函数中访问变量以在java的main方法中使用

如何从action listener/类构造函数中访问变量以在java的main方法中使用,java,swing,actionlistener,class-constructors,Java,Swing,Actionlistener,Class Constructors,我有一个框架,带有一个组合框,显示不同的形状和一个按钮,对于按钮,我添加了一个动作监听器,它将从组合框中获取所选项目,并将其存储为字符串,我将其声明为公共类变量,在我的主要方法中,我想访问这个字符串,使雀鸟机器人绘制那个形状,但无论我尝试什么,我似乎都无法访问它 public class DrawShape { private JFrame frame; private String[] choices = {"circle", "square", "triangle", "r

我有一个框架,带有一个组合框,显示不同的形状和一个按钮,对于按钮,我添加了一个动作监听器,它将从组合框中获取所选项目,并将其存储为字符串,我将其声明为公共类变量,在我的主要方法中,我想访问这个字符串,使雀鸟机器人绘制那个形状,但无论我尝试什么,我似乎都无法访问它

public class DrawShape 
{
    private JFrame frame;
    private String[] choices = {"circle", "square", "triangle", "rectangle", "quit"};
    public String choice = "";

    //class constructor 
    public DrawShape() 
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        JPanel p = new JPanel();
        final JComboBox cb = new JComboBox(choices);
        JButton button = new JButton("Done");

        p.add(cb);
        p.add(button);
        frame.add(p);

        //create an action listener that, when button is clicked, gets the selected choice and stores it to
        //the string variable 'choice'
        button.addActionListener(new ActionListener()
                {
                    @Override 
                    public void actionPerformed(ActionEvent e)
                    {
                        choice = (String)cb.getSelectedItem();
                    }
                }) ;

        frame.pack();


    }
    public static void main(String[] args)
    {
        new DrawShape();
        System.out.println(choice);
    }
}

我不建议使用非私有变量。但是,您需要保留对您创建的对象的引用,然后通过该引用访问字段,就像调用对象上的方法一样

    DrawShape draw = new DrawShape();
    System.out.println(draw.choice);
但是,您应该看到
null
,因为它是在构建对象后立即调用的,而不是从侦听器调用的

您可能希望从侦听器执行代码。所以要么把打印代码放在监听器中,要么让监听器调用另一个方法


GUI编程倾向于事件驱动。不要期望能够对用户交互进行排序-用户驱动。

在这种情况下,您应该使用getter/setter。您的操作侦听器将调用getter方法,该方法将依次获取combobox中的内容

下面是一个如何工作的示例:


希望这能有所帮助。

根据您的代码,在调用动作侦听器时选择此选项。我认为当你在主方法中打印选项时,你的动作监听器没有被调用,是吗?我知道,我试过了,但它没有给我想要的结果-你认为我应该放弃使用swing而只使用控制台吗?我想弄清楚这件事已经有一段时间了now@SelinaBucur在我的答案的其余部分之前的代码将编译,但由于解释的原因,将给出
null
。事件驱动编程在编程的许多领域都很重要,而交互式控制台程序则不那么重要。因此,我会坚持让您了解GUI编程。操作侦听器已经在组合框上调用了getter方法。如果您建议在
DrawShape
中添加一个getter方法,那么这将是毫无意义的。