【问题标题】:How can I check that JButton is pressed? If the isEnable() is not work?如何检查 JButton 是否被按下?如果 isEnable() 不起作用?
【发布时间】:2014-01-14 22:52:56
【问题描述】:

如何检查 JButton 是否被按下?我知道有一个方法叫“isEnabled”

所以我尝试编写代码进行测试。

  1. 此代码有 2 个 Jbutton,分别是“添加”按钮和“结帐”按钮。
  2. 当我按下“添加”按钮后按下“结帐”按钮时,代码将显示“按下添加按钮”消息,但如果在按下“结帐”按钮之前未按下“添加”按钮,则代码将显示“未按下添加按钮”消息。

代码如下:

final JButton btnAdd = new JButton("Add");
btnAdd.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    }
});
panel.add(btnAdd);
JButton btnConfirm = new JButton("Check Out");
btnConfirm.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (btnAdd.isEnabled()) {
            System.out.println("Add Button is pressed");
        }
        if (!btnAdd.isEnabled()) {
            System.out.println("Add Button is not pressed");
        }
    }
});

当我运行此代码时,尽管我没有按下“添加”按钮,但代码只给出了“按下添加按钮”。为什么会这样?

【问题讨论】:

  • 初始化后btnAdd.setEnabled(false);
  • 检查是否按下的目的究竟是什么?侦听器仅注册到一个按钮,因此只需执行所需的操作而不检查任何内容
  • @peeskillet 如何在不添加任何内容的情况下结帐!!
  • @iShaalan,你是什么意思?
  • @peeskillet 确切地说,如果它被删除了怎么办? :))

标签: java swing awt jbutton


【解决方案1】:

JButton 有一个 model 可以回答这些问题:

  • isArmed(),
  • isPressed(),
  • isRollOVer()

等等。因此,您可以向模型询问您正在寻找的答案:

     if(jButton1.getModel().isPressed())
        System.out.println("the button is pressed");

【讨论】:

  • 不错的建议,但除非 OP 检查其 ActionListener 中的添加按钮的状态,否则它将始终被解除/未按下。这就是JButton 的工作原理...
  • 是的!事实上,如果他使用ActionListner,他甚至根本不需要检查 isPressed 类型检查。他只需声明一个布尔值并在目标按钮的动作侦听器侦听动作事件时使其为真。我只是想让用户知道这些针对isEnabled() 的功能:)。这些天来,很多用户的问题没有多大意义,但其他人甚至不关心这一点:因此让我变得贪婪。道歉,但谁不想变得富有?
  • @Sage 仍然无法正常工作。尽管我已经按下了该按钮,但代码给了我“假”值这里的代码:btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { System.out.println(""+btnAdd.getModel(). isPressed() ); } });
  • 遵循 MadProgrammer 建议的答案。他已经解释了为什么它不起作用的原因。我的目的是让你知道几个状态函数是如何存在的。 :)
【解决方案2】:

看来你需要使用JToggleButton

JToggleButton tb = new JToggleButton("push me");
tb.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton btn =  (JToggleButton) e.getSource();
        btn.setText(btn.isSelected() ? "pushed" : "push me");
    }
});

【讨论】:

    【解决方案3】:

    JButton#isEnabled改变一个组件的用户交互性,即用户是否能够与其交互(按下它)。

    当按下JButton 时,会触发actionPerformed 事件。

    当您按下确认按钮时,您将收到Add button is pressed,因为添加按钮已启用。如前所述,它与按钮的按下开始无关。

    根据您的代码,如果您尝试在确认按钮的 ActionListener 中检查添加按钮的“按下”开始,则它始终是错误的,因为该按钮只会在添加按钮的 @ 时处于按下状态正在呼叫 987654327@s。

    基于所有这些信息,我建议您可能要考虑使用JCheckBox,然后您可以使用JCheckBox#isSelected 来确定它是否已被检查。

    仔细查看How to Use Buttons了解更多详情

    【讨论】:

    • +1:我刚刚对此发表了评论.. 抱歉没有注意到 :) 我同意他应该改变设计感。事实上,当他正在检查 Check button 时,Add Button 被按下:我没有看到任何依赖输入控制组件的理由,正如 peeskiller 所指出的那样
    • @Sage 不用担心,说同样话的人越多,我们就越有可能传达我们的信息;)
    【解决方案4】:

    只需在actionPerformed(ActionEvent e) 函数中执行System.out.println(e.getActionCommand());。这将告诉您刚刚执行了哪个命令。

    if(e.getActionCommand().equals("Add")){
    
       System.out.println("Add button pressed");
    }
    

    【讨论】:

    • 取决于动作命令!不,我不认为这是一个好建议。请重新思考并阅读其他答案:)
    • @Sage 你们都很好。但我测试了这个,它可以工作,而且是一种简单的方法。
    【解决方案5】:

    您尝试使用的方法检查按钮是否处于活动状态:

    btnAdd.isEnabled()

    启用后,与此对象关联的任何组件都处于活动状态并能够触发此对象的 actionPerformed 方法。

    此方法不检查按钮是否被按下。

    如果我正确理解您的问题,您希望在用户单击“结帐”后禁用“添加”按钮。

    尝试在开始时禁用您的按钮:btnAdd.setEnabled(false) 或在用户按下“签出”之后

    【讨论】:

      【解决方案6】:

      使用此命令

      if(JButton.getModel().isArmed()){
          //your code here.
          //your code will be only executed if JButton is clicked.
      }
      

      答案很简短。但它对我有用。使用按钮的变量名而不是“JButton”。

      【讨论】:

        猜你喜欢
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2015-12-20
        • 2021-11-18
        • 1970-01-01
        相关资源
        最近更新 更多