我想主要应该在每次点击按钮时打印你好(在弹出对话框中)。所以我设计了以下程序,但似乎没有用。程序编译并执行得很好但是当我点击按钮时,我没有看到任何对话框弹出。我已经设置了布尔变量的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");
}
}
}
答案 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
,并将Action
与JButton
相关联。这样构造abc
实例的类负责按下按钮时的行为abc
抽象为摘要,让你的ActionListener
调用该抽象方法。然后,每当您想要不同的行为时,您就可以对此类进行具体实现。有关您的代码的进一步说明:
while( true )
循环null
布局并使用LayoutManager
代替