使方法在Java GUI中触发另一个方法

时间:2014-01-16 00:25:38

标签: java swing events event-handling

请考虑以下代码。

import edu.cmu.ri.createlab.terk.robot.finch.Finch;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class RobotControl extends JFrame { 
    public static void main (String args[])  {

    RobotControl GUI = new RobotControl(); //GUI is the name of my object.
    GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GUI.setSize(300,300);
    GUI.setVisible(true);
    GUI.setTitle("RobotControl");
}


    private JButton foward;



    public RobotControl() { //constructor
    setLayout (new FlowLayout());

    foward = new JButton("foward");
    add(foward);

    ActionListener e = new event();
    foward.addActionListener(e);
    }
             public class event implements ActionListener {
                       public void actionPerformed1(ActionEvent e){


    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}

}

现在考虑以下代码,让我的雀科机器人向前移动10秒钟。

            Finch myf = new Finch();
            myf.setWheelVelocities(255, 255, 10000);

现在,我的问题是,是否可以从第一段代码中单击GUI上创建的foward按钮来执行第二段代码?如果是这样我将如何去做。我已经尝试将finch代码放入actionListener类但没有任何反应。我哪里错了。我需要建议。

2 个答案:

答案 0 :(得分:2)

以下是示例代码:

-------------------------
RobotControl.java
myrobot = new Finch();

foward = new JButton("foward");
    add(foward);
    forward.addActionListener(new ForwardButtonListener(myrobot));


-------------------------
ForwardButtonListener.java
public class ForwardButtonListener implements ActionListener {

    Finch robotToControl;

    public FowardButtonListener(Finch aRobot) {
        robotToControl = aRobot;
    }

    public void actionPerformed (ActionEvent e) {
        robotToControl.setWheelVelocities(255, 255, 10000);
    }

}
-------------------------

答案 1 :(得分:0)

简短的回答是,是的。

首先,您需要将Finch的实例维护为实例变量...

public class RobotControl extends JFrame { 
    private Finch finch;
    //...
}

您需要创建Finch ...

的实例
public RobotControl {
    finch = new Finch();
}

然后在ActionListener中,您需要与Finch

“沟通”
public void actionPerformed1(ActionEvent e){
    myf.setWheelVelocities(255, 255, 10000);
}

答案很长,很可能你必须按顺序发出多个命令,问题就在于,这个过程可能会阻止事件调度线程,阻止响应新的传入事件并使其看起来像就像你的申请已“停止”

虽然有多种方法可以缓解此问题,但如果您不需要Finch与UI进行通信(例如电机的报告状态等),您可以简单地使用单线程{{ 1}}某种,只需通过它发出一系列命令。

如果您需要向客户端UI提供反馈,事情会变得更加复杂......