方法 `actionPerformed()` 被执行了几次(多于可数)
method `actionPerformed()` getting executed several times(more than countable)
while(b==true){
if((!tf.getText().equals("")) ){
System.out.println("outside actionPerformed");
p.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why"+EventQueue.isDispatchThread());
b=false;
System.out.println(b);
}
});
}
}
actionPerformed()
里面的东西被执行了好几次。它应该只执行一次。
谈论你的代码;并添加
if(p.getActionListeners().length==0){ //this line fix adding multiple
times
while(b==true){ //loops multiple times and add multiple actionlistener and dangerous because of you CPU will be top while this loops run :)
if((!tf.getText().equals("")) ){
System.out.println("outside actionPerformed");
if(p.getActionListeners().length==0){ //this line fix adding multiple times
p.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why"+EventQueue.isDispatchThread());
b=false; //This line execute when an action occurs
System.out.println(b);
}
});
}
}
}
步骤 1.
摆脱你的线程,你不需要,事实上,线程在 Swing 中是一个危险的东西,需要非常小心地对待
第 2 步
您正在考虑线性方式,这不是 GUI 的工作方式,GUI 是事件驱动的,也就是说,将来可能会发生某些事情,您需要相应回应
例如,假设 p
是一个 JButton
,您可以将它们声明为 class...
中的实例字段
private JButton p;
private JTextField tf;
然后当你初始化 UI 时(可能在构造函数中),你会设置 p
并注册它是 ActionListener
...
p = new JButton("Go");
p.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why" + EventQueue.isDispatchThread());
b = false;
System.out.println(b);
}
});
p.setEnabled(false);
设置 p
禁用将阻止用户单击它。这有两个好处,一是它可以防止 ActionListener
被触发,二是它向用户发送了一条明确的消息,即他们无法单击此按钮。据我所知,目前您的按钮可以被点击,但没有执行任何操作...有点让用户感到沮丧
然后设置文本字段...
tf = new JTextField(20);
tf.getDocument().addDocumentListener(new DocumentListener() {
protected void update() {
p.setEnabled(tf.getText().trim().length() > 0);
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
});
本例中的 DocumentListener
允许您实时监控文本字段状态的变化并相应地更新按钮的状态...
while(b==true){
if((!tf.getText().equals("")) ){
System.out.println("outside actionPerformed");
p.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why"+EventQueue.isDispatchThread());
b=false;
System.out.println(b);
}
});
}
}
actionPerformed()
里面的东西被执行了好几次。它应该只执行一次。
谈论你的代码;并添加
if(p.getActionListeners().length==0){ //this line fix adding multiple times
while(b==true){ //loops multiple times and add multiple actionlistener and dangerous because of you CPU will be top while this loops run :)
if((!tf.getText().equals("")) ){
System.out.println("outside actionPerformed");
if(p.getActionListeners().length==0){ //this line fix adding multiple times
p.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why"+EventQueue.isDispatchThread());
b=false; //This line execute when an action occurs
System.out.println(b);
}
});
}
}
}
步骤 1.
摆脱你的线程,你不需要,事实上,线程在 Swing 中是一个危险的东西,需要非常小心地对待
第 2 步
您正在考虑线性方式,这不是 GUI 的工作方式,GUI 是事件驱动的,也就是说,将来可能会发生某些事情,您需要相应回应
例如,假设 p
是一个 JButton
,您可以将它们声明为 class...
private JButton p;
private JTextField tf;
然后当你初始化 UI 时(可能在构造函数中),你会设置 p
并注册它是 ActionListener
...
p = new JButton("Go");
p.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
ne.remove(p);
ne.revalidate();
ne.repaint();
System.out.println("why" + EventQueue.isDispatchThread());
b = false;
System.out.println(b);
}
});
p.setEnabled(false);
设置 p
禁用将阻止用户单击它。这有两个好处,一是它可以防止 ActionListener
被触发,二是它向用户发送了一条明确的消息,即他们无法单击此按钮。据我所知,目前您的按钮可以被点击,但没有执行任何操作...有点让用户感到沮丧
然后设置文本字段...
tf = new JTextField(20);
tf.getDocument().addDocumentListener(new DocumentListener() {
protected void update() {
p.setEnabled(tf.getText().trim().length() > 0);
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
});
本例中的 DocumentListener
允许您实时监控文本字段状态的变化并相应地更新按钮的状态...