在按钮单击时将变量值返回到main

时间:2012-08-29 17:15:56

标签: java swing jframe jbutton propertychangelistener

我想主要应该在每次点击按钮时打印你好(在弹出对话框中)。所以我设计了以下程序,但似乎没有用。程序编译并执行得很好但是当我点击按钮时,我没有看到任何对话框弹出。我已经设置了布尔变量的getter和setter(button_clicked),其值在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");
    }
}

}

6 个答案:

答案 0 :(得分:3)

JOptionPane.showMessageDialog()方法下移动actionPerformed()来电并删除while()方法下的main内容。

答案 1 :(得分:2)

您可能希望阅读有关"How to Write an Action Listener"的信息,以帮助您在代码中实施ActionListner

您的代码的基本理念是:

  • 声明事件处理程序类
  • 使用JButton
  • 将事件处理程序类的实例注册为侦听器
  • 包含在侦听器接口中实现方法的代码。在您的情况下,您将覆盖actionPerformed()并在那里编写逻辑以显示对话框。 "How to Make Dialogs"对你来说是另一个有用的教程。

答案 2 :(得分:2)

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

可以使该机制独立于主类。请查看Observer design pattern以了解如何执行此操作。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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);
    }    
}

答案 5 :(得分:0)

根据您提供的评论,您希望重复使用abc类(名称非常差且不符合Java命名标准)用于多种目的,因此您不希望包括按下abc班级中的按钮时执行的代码。

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

  • Action课程的构造函数中传递abc,并将ActionJButton相关联。这样构造abc实例的类负责按下按钮时的行为
  • abc抽象为摘要,让你的ActionListener调用该抽象方法。然后,每当您想要不同的行为时,您就可以对此类进行具体实现。

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

  • 摆脱while( true )循环
  • 摆脱null布局并使用LayoutManager代替
  • 应在事件调度线程上创建和访问Swing组件。有关更多信息,请参阅Concurrency in Swing教程