当前位置: 首页 > 面试题库 >

如何将动作侦听器设置为3个按钮

吕奇
2023-03-14
问题内容

我正在尝试制作带有三个按钮的秒表,分别是“开始”,“暂停”和“停止”。我的老师只教我们如何将动作监听器设置为两个按钮。如何将动作监听器设置为三个按钮?到目前为止,这是我的编码

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);

public void actionPerformed(ActionEvent actionEvent) {
    Calendar aCalendar = Calendar.getInstance();
    if (actionEvent.getActionCommand().equals("Start")){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );

    }
}

我还没有为“暂停”功能设置任何动作监听器,因为无论如何我都不知道如何暂停计时器。但是我想先将动作链接到按钮,然后再弄清楚如何暂停。


问题答案:

您正在寻找的是一条if-then-else if-then声明。

基本上,ActionListener像往常一样将都添加到所有三个按钮…

JButton startButton = new JButton("Start");
JButton stopButton = new JButton("Stop");
JButton pauseButton = new JButton("Pause");

startButton.addActionListener(this);
stopButton.addActionListener(this);
pauseButton.addActionListener(this);

然后提供if-else-if一系列条件以测试每种可能的情况(您期望的)

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if (e.getSource() == startButton){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else if (e.getSource() == stopButton) {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if (e.getSource() == pauseButton) {
        // Do pause stuff
    }
}

仔细查看if-then和if-then-
else语句
以获取更多详细信息

与其尝试使用对按钮的引用,不如考虑使用代替的actionCommand属性AcionEvent,这意味着您将不需要引用原始按钮…

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if ("Start".equals(e.getActionCommand())){
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    } else if ("Stop".equals(e.getActionCommand())) {
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if ("Pause".equals(e.getActionCommand())) {
        // Do pause stuff
    }
}

这也意味着,你可以重复使用ActionListener的东西像JMenuItemS,只要他们有相同的actionCommand

话虽如此,我鼓励你不要遵循这种范例。通常,我鼓励您使用Actions
API,但是对于您现在所处的位置,这可能有点太先进了,相反,我鼓励您利用Java的匿名类支持,例如…


startButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        start = aCalendar.getTimeInMillis();
        aJLabel.setText("Stopwatch is running...");
    }
});
stopButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        aJLabel.setText("Elapsed time is: "
                + (double) (aCalendar.getTimeInMillis() - start) / 1000);
    }
});
pauseButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Do pause stuff
    }
});

这样可以将每个按钮的职责隔离为一个ActionListener,从而使您更容易查看正在发生的事情,并在需要时轻松进行修改,而不必担心或影响其他按钮。

它还消除了维护对按钮的引用的需要(因为可以通过ActionEvent getSource属性获得该引用)



 类似资料:
  • 问题内容: 按下手机上的按钮时,我想执行自定义操作。 是否可以在按钮上设置onClickListener(或类似按钮)? 仅在第一次按下按钮时才被调用-我已经尝试过了。 问题答案: 通常,您不应因为用户期望菜单出现而覆盖行为,但是您可以沿以下方式使用:

  • 问题内容: 我有一个带有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有一种方法可以将单个侦听器附加到程序中所有现有的JButton。 问题答案: 就像是: 该会从事件使其知道哪个按钮被点击获取源对象。 如果您需要在Action中使用if / else逻辑,那么您应该创建一个单独的Action。如果代码不属于某个动作,请勿将其强制执行。

  • 问题内容: 我在设计代码时遇到麻烦。我有3个不在按钮组中的按钮。我想-基于选定的按钮- 执行一项操作。现在,该操作需要修改类中的对象。这意味着我不能使用内部类,因为它无法访问外部类。如果我可以将事件侦听器添加到按钮组,这会容易得多,但是如我所见,我将需要每个单选按钮的事件处理程序,这是否正确?如果没有,我该怎么办?谢谢 一个简单的例子 问题答案: 您可以为所有按钮设置相同的侦听器。 伪代码:

  • 问题内容: 我有两个分别称为“左”和“右”。“左”按钮将矩形对象向左移动,“右”按钮将其向右移动。我在班上有一个充当单击任一按钮时的侦听器。但是,我希望单击每个动作时都会发生不同的动作。如何区分点击的? 问题答案: 将actionCommand设置到每个按钮。 //将动作命令设置到两个按钮上。 更新:

  • 我有一个有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有办法将一个侦听器附加到程序中所有现有的JButton。

  • 我要做的是设置一个SOCKS服务器,然后将其端口添加为SSH隧道连接中的本地侦听端口。我想要实现的是动态端口转发(如果我没记错的话,ssh中的-d选项)。我使用JSch进行SSH隧道。以下是我到目前为止的代码(从http://kahimyang.info/kauswagan/code-blogs/1337/ssh-tunneling-with-java-a-database-connection-