0

我希望每次单击按钮时 main 都应该打印 hello (在弹出对话框中)。所以我设计了以下程序,但它似乎不起作用。该程序编译并执行得很好,但是当我单击按钮时,我看不到任何对话框弹出。我已经放置了布尔变量 (button_clicked) 的 getter 和 setter,其值正在 main() 块中进行测试。知道的请帮忙..

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

class abc extends JFrame implements ActionListener{

boolean button_clicked = false;
JButton b1;

abc(){
    this.setSize (400, 400);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.createUI();
}

void createUI(){
    this.setLayout(null);
    b1 = new JButton("x");
    b1.setSize(110,30);
    b1.setLocation(10,210);
    this.add(b1);

    b1.addActionListener(this);
}

public boolean isButton_clicked() {
    return button_clicked;
}

public void setButton_clicked(boolean button_clicked) {
    this.button_clicked = button_clicked;
}


public void actionPerformed(ActionEvent arg0) {
    button_clicked = true;

    //I don't want to print the dialogue box from here..
    //I want to keep everything under main()'s control.
}

}


public class tempMain extends JFrame {

public static void main(String[] args) {
    abc temp = new abc();
    temp.setVisible(true);
    while(true){
        if(temp.isButton_clicked())
            JOptionPane.showMessageDialog(null, "Hello");
    }
}

}
4

6 回答 6

3

移动方法JOptionPane.showMessageDialog()下的调用actionPerformed(),删除方法while()下的事物main

于 2012-08-29T17:19:07.580 回答
2

您可能想阅读“如何编写动作侦听器”来帮助您ActionListner在代码中实现 an。

您的代码的基本思想是:

  • 声明一个事件处理程序类
  • 将事件处理程序类的实例注册为您的侦听器JButton
  • 在侦听器接口中包含实现方法的代码。在您的情况下,您将覆盖actionPerformed()并在那里编写您的逻辑以显示一个对话框。“如何制作对话框”对您来说将是另一个有用的教程。
于 2012-08-29T17:23:40.517 回答
2

正如@Quinman 指出的那样,您的代码设计确实存在缺陷。我了解您不希望出于某些我不明白的个人原因将 JOptionPane 置于 actionperformed 方法下。基于这个前提,我认为最好的解决方案是创建一个回调,即让你的 JFrame 知道主类并在单击按钮时调用它。

可以使这种机制独立于主类。请检查观察者设计模式以了解如何做到这一点。

您的代码还有另一个缺陷 - 单击按钮时,我会收到无限的 Hello 消息。为了避免这种情况,您应该将 button_clicked 变量设置为 false。我只提到作为一般提示,因为事实上你真的应该摆脱你的时间造成的忙碌等待。

于 2012-08-29T17:28:10.470 回答
2

您可能正在寻找无模式对话框。在此示例中,名为 的主面板在对话框中Observer侦听。ObservedPanel通过使用PropertyChangeListener,对对话框所做的任何更改都会立即反映在主面板中。

于 2012-08-29T18:03:26.123 回答
2

正如许多人已经指出的那样,您的方法和设计是有缺陷的。我不会进一步讨论,因为它已经处理过,但作为一个建议,你可以尝试......

abc temp = new abc();
temp.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        JOptionPane.showMessageDialog(null, "Look Ma, I'm in Main...");
    }
});
temp.setVisible(true);

在你的abc课上...

class abc JFrame implements {
    // build your class as normal

    public void addActionListener(ActionListener listener) {
        b1.addActionListener(listener);
    }    
}
于 2012-08-29T23:42:31.703 回答
0

从您提供的评论来看,您希望将您的abc类(名称很差且不符合 Java 命名标准)用于多种不同的目的,因此您不想包含按时执行的代码类中的按钮abc

有多种解决方案(第一个是我的首选)

  • Action在您的类的构造函数中传递一个abc并将其耦合ActionJButton. 这样,构造abc实例的类负责按下按钮时的行为
  • 抽象并让abcActionListener调用该抽象方法。然后,您可以在每次需要不同行为时对此类进行具体实现。

关于您的代码的进一步说明:

  • 摆脱那个while( true )循环
  • 摆脱null布局并使用 aLayoutManager代替
  • Swing 组件应该在Event Dispatch Thread上创建和访问。有关更多信息,请参阅Swing 中的并发教程
于 2012-08-30T08:34:26.990 回答