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()
内的任何内容正在执行多次。它应该只执行一次。
答案 0 :(得分:2)
摆脱你的线程,你不需要,事实上,Swing中的线程是危险的,需要非常小心地对待
你正在考虑线性方式,这不是GUI的工作方式,GUI是事件驱动的,也就是说,未来可能发生的事情,你需要相应地回应它
例如,我们假设p
是JButton
,您可能会将它们声明为您班级中的实例字段...
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
允许您实时监控文本字段状态的更改并相应地更新按钮的状态...
答案 1 :(得分:1)
谈论你的代码;并添加了
if(p.getActionListeners()。length == 0){//此行修复添加多个 次
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);
}
});
}
}
}