0

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

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);
    }
}
4

2 回答 2

0

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

    DrawShape draw = new DrawShape();
    System.out.println(draw.choice);

但是,您应该看到null,这是在您构造对象后立即调用的,而不是从侦听器中调用的。

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

GUI 编程往往是事件驱动的。不要期望能够对用户交互进行排序——用户驱动。

于 2019-12-21T12:19:24.897 回答
0

在这种情况下,您应该使用 getter/setter。您的动作侦听器将调用 getter 方法,该方法又会获取组合框中的内容。

这是一个如何工作的示例:https ://www.codejava.net/coding/java-getter-and-setter-tutorial-from-basics-to-best-practices

希望这可以帮助。

于 2019-12-22T18:16:00.493 回答