2
class GameFrameClass extends javax.swing.JFrame  {

    public void MyFunc()
    {
        UserButton.setText(Str);
        UserButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                UserButtonActionPerformed(evt);
            }
        });
        getContentPane().add(UserButton);
    }

    private void UserButtonActionPerformed(java.awt.event.ActionEvent evt) {

        //print some stuff after mouse click
    }
}

在另一个类中,我定义了这个函数

void functionAdd()
{
    GameFrameClass gfc = new GameFrameClass()
    gfc.MyFunc()
    System.out.println("PRINT THIS AFTER MOUSE CLICK")  
}

如果有人可以查看此代码。我想等待鼠标点击。有没有办法在单击鼠标后打印 System.out.println("PRINT THIS AFTER MOUSE CLICK") 行。现在这会立即发生,我不能等待鼠标点击。有没有办法做到这一点?除了在函数 UserButtonActionPerformed() 中执行此操作。请告诉我 。

4

4 回答 4

3

这是一种非常“糟糕”的方式......

private void UserButtonActionPerformed(java.awt.event.ActionEvent evt) {
    addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent evt) {
            System.out.println("PRINT THIS AFTER MOUSE CLICK");
            removeMouseListener(this);
        }
    });
}

更好的方法是在actionPerformed方法中添加一个标志来“启用”鼠标侦听器(您之前添加的)。这个监听器会在每次点击时检查标志,当设置为它时,true它会翻转标志(到false)并处理事件......

于 2012-10-01T03:09:42.247 回答
2

从措辞很难看出,但我假设他或她只是想在按钮被触发后执行代码(而不是实际上等待)。为此,您需要在 actionlistener(在本例中UserButtonActionPerformed)调用的方法中添加代码。

所以:

private void UserButtonActionPerformed(java.awt.event.ActionEvent evt) {

 System.out.println(...);

}

此外,遵循 Java 编码约定将有助于人们在未来回答您的问题。

于 2012-10-01T03:11:26.737 回答
1

事件在另一个线程上进行管理,即事件调度线程,它们不由正在执行代码的线程(大概是主线程)管理。

这意味着您可以将侦听器附加到 GUI 元素,但“等待”点击的唯一方法是执行actionPerformed回调中的代码。

没有办法暂停执行,因为addActionListener它没有做任何事情来有效地捕获事件,它只是添加了侦听器。从理论上讲,您可以锁定主线程等待事件分派通知,但这只是一个糟糕的设计。

于 2012-10-01T03:08:09.233 回答
1

您始终可以通过在同一个类中定义 UserButtonActionPerformed 来等待。如果是这种情况,那么您不应该遇到您面临的问题

于 2012-10-03T08:14:45.163 回答