当前位置: 首页 > 知识库问答 >
问题:

两次调用ActionListener

程谦
2023-03-14

我觉得有一个简单的解决办法,但由于某些原因,我不能把我的头围绕它。

我有一个情况,一个按钮必须先点击,才能点击另一个。用户为这2个JButtons选择的选项将决定程序的下一步。这意味着我必须调用actionListener两次,对吗?我如何在一个actionPerformed方法中做到这一点?

如果actionPerformed方法中的(e.getSource()==Square[1][4]&&e.getSource()==up){},我认为我无法执行...

编辑:我有一个4x4按钮板,我使用一个2D数组的JButtons,它们包含两块。我还有4个JButtons代表north,east,south,West。用户必须点击4x4板上的一个片段,然后点击方向,以便该片段移动。

public class Board extends JPanel implements actionListener
{
    // other variables listed

    private JButton[][] square;

    private boolean circleSelected = false;
    private boolean triangleSelected = false;
    
    // other irrelevant methods
    
    public void actionPerformed(actionEvent e)
    {
        // I don't know how to go about this part 
    }
}

如果需要,我有正方形[0][0]包含圆块,正方形[2][3]包含三角形块。但是,由于x和y会不断变化,所以我不想指定确切的位置。相反,我宁愿从clicekd的图像中确定circleeselected变量,即如果用户单击按钮[x][y],该按钮上有一个圆的图像,那么circleeselected=true如果这有意义的话...


共有2个答案

姜卜霸
2023-03-14

只需创建一个布尔变量isButtonOneClicked,它可以显示是否单击了第一个按钮,如果单击了按钮2,并且变量的值为true,则将执行下一个操作

boolean isButtonOneClicked=false;
button1.addActionListener(new ActionListener(){  
   public void actionPerformed(ActionEvent e){ 
        isButtonOneClicked=true;
  }  
});
button2.addActionListener(new ActionListener(){  
   public void actionPerformed(ActionEvent e){ 
      if(isButtonOneClicked){
          //perform next steps
       }
       else{
            // button 1 isn't clicked 
            // can't proceed to next Steps

       }

  }  
});
诸福
2023-03-14
匿名用户

这意味着我必须调用actionListener两次,对吗?

不完全是。您不应该直接调用ActionListener一次,而是这些侦听器应该只响应用户操作。

如果actionPerformed方法中的(e.getSource()==Square[1][4]&&e.getSource()==up){},我认为我无法执行...

正确,这将是非常错误的,因为ActionEvent的source属性引用了一个且仅有一个对象。

您应该做的很可能是使用类的一个私有实例字段或多个字段来保存在侦听器中使用的状态信息。换句话说,让一个或多个变量保存信息,告诉类以前是否按下了某个按钮、哪个按钮等等,然后根据这些状态变量保存的信息来确定侦听器中发生的事情。对于更具体的细节和答案,请考虑问一个更具体的问题,包括相关的代码,最好是一个最小的示例程序。

顺便说一句,大多数按钮都应该有自己的监听器,通常是一个匿名的内部类。

旁白2:如果一个按钮在另一个按钮被按下之前不应该被按下,那么该按钮或其动作应该被禁用,直到该按钮被按下为止。可以通过对按钮或其操作(如果有操作)调用.setEnabled(...)来更改。

例如,请尝试编译并运行下面的代码。在这里,我使用firstbutton作为状态字段,它更改ActionListener的行为。为此,您可以使用布尔值或该类的任何实例字段:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel {
    public static final int ROWS = 4;
    private JButton[][] square = new JButton[ROWS][ROWS];

    private JButton firstButton = null;
    
    public Board() {
        JPanel squarePanel = new JPanel(new GridLayout(ROWS, ROWS));
        for (int i = 0; i < square.length; i++) {
            for (int j = 0; j < square.length; j++) {
                String text = String.format("[%d, %d]", j, i);
                square[i][j] = new JButton(text);
                square[i][j].setFont(square[i][j].getFont().deriveFont(32f));
                square[i][j].addActionListener(e -> squareListener(e));
                squarePanel.add(square[i][j]);
            }
        }
        
        setLayout(new BorderLayout());
        add(squarePanel);
    }
    
    private void squareListener(ActionEvent e) {
        if (firstButton == null) {
            firstButton = (JButton) e.getSource();
            firstButton.setEnabled(false);
        } else {
            JButton secondButton = (JButton) e.getSource();
            secondButton.setEnabled(false);
            String text = "First Button: " + firstButton.getActionCommand() + "; Second Button: " + secondButton.getActionCommand();
            JOptionPane.showMessageDialog(this, text, "Selected Buttons", JOptionPane.PLAIN_MESSAGE);
            for (JButton[] row : square) {
                for (JButton button : row) {
                    button.setEnabled(true);
                }
            }
            firstButton = null;
        }
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Board());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

 类似资料:
  • 问题内容: 我在Go中关注一个简单的Web服务器示例。 我插入了一条语句,使生成的代码如下所示: 问题是,每当我在Web浏览器中加载端口8000时,此函数就会被调用两次。这是一个问题,因为我打算在每次页面访问时增加一个计数器。通过这种行为,计数器将增加两次。OTOH,如果我这样做,它只会被调用一次。 我觉得我在这里失踪真的很愚蠢。 问题答案: 只需记录请求。您将意识到您的浏览器还请求/favico

  • 我仍在尝试将RXJava2用于多个订阅者使用的轮询服务。它工作得很好,除了它总是调用两次。 我尝试使用publish(1)、take(1)、share()、refCount()等,但结果总是一样。叫两次或多次。 我还是不明白为什么它叫了两次。新订阅服务器应该接收最新发出的值,并且只在更改后的值(如果hashmap更改了)返回为modified List。 我的民意调查可观察到(单例) 我的谓词用于

  • 问题内容: 为什么在组合框中选择项目时会两次调用此事件? 问题答案: 对于一次更改,JComoboBox ItemListener确实会被调用两次。一次用于SELECTED事件,一次用于DESELECTED事件。 有关如何编写ItemListener的信息,请参见本教程页面。 基本上你要做的就是

  • 出于某种原因,我的Spring AOP建议被调用了两次。我查过了: > Spring AOP通知被调用了两次,但我没有使用组件注释,我只声明了一次方面bean,并用@aspect注释它,仅此而已。 我用@Aspect声明一个类,然后在应用程序上下文中将它声明为bean。XML文件中没有建议或切入点。 第三次编辑: 还值得注意的是,我在执行方法之前和之后都记录了被告知与周围: 通气管

  • 我正在使用带有片段的FragmentPagerAdapter。我的问题是,当我调用setCurrentItem时,正在加载的片段的OnCreateView方法被调用两次。但是,需要注意的是,片断不是重新创建的,而是简单地恢复的。我非常想找到一个解决方案,使OnCreateView只能被调用一次。 两次调用Android oncreateview OnCreateView多次调用/使用ActionB

  • 问题内容: 我是新手并尝试学习过滤器的概念,但在我的情况下是两次调用过滤器,我期望过滤器只运行一次,但运行两次。不能理解为什么会这样。 这是我的 朋克 … 问题答案: 如果我没有把你的问题弄错的话,这就是这里的问题 Angularjs 使用“脏检查”方法,因此需要调用所有过滤器以查看是否存在任何更改。此后,它检测到一个变量(您键入的变量)有变化,然后再次执行所有过滤器以检测是否有其他变化。 这是另